Получить конкретную строку из текстового файла, используя только скрипт


Я пытаюсь получить определенную строку из текстового файла.

до сих пор в Интернете я видел только такие вещи, как sed, (я могу использовать только sh-not bash или sed или что-то в этом роде). Мне нужно сделать это только с помощью базового сценария оболочки.

cat file | while read line
    do
       #do something
    done

Я знаю, как перебирать строки, как показано выше, но что делать, если мне просто нужно получить содержимое конкретной строки

9 67

9 ответов:

sed:

sed '5!d' file

awk:

awk 'NR==5' file

предполагая, что line - это переменная, которая содержит требуемый номер строки, Если вы можете использовать head и tail, тогда все довольно просто:

head -n $line file | tail -1

если нет, то это должно работать:

x=0
want=5
cat lines | while read line; do
  x=$(( x+1 ))
  if [ $x -eq "$want" ]; then
    echo $line
    break
  fi
done

вы могли бы использовать sed -n 5p file.

вы также можете получить диапазон, например,sed -n 5,10p file.

Я обычно использую это для этого:

sed '5q;d' file

Если, например, вы хотите получить строки от 10 до 20 файла, вы можете использовать каждый из этих двух методов:

head -n 20 york.txt | tail -11

или

sed -n '10,20p' york.txt 

p в вышеуказанной команде стоит для печати.

вот что вы увидите: enter image description here

стандартный способ сделать это-использовать внешние инструменты. Запрещение использования внешних инструментов при написании сценария оболочки абсурдно. Однако, если вы действительно не хотите использовать внешние инструменты, вы можете распечатать строку 5 с помощью:

i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file

обратите внимание, что это будет печатать логическую линию 5. То есть, если input-file содержит продолжение строки, они будут считаться как одна строка. Вы можете изменить это поведение, добавив -r команда чтения. (Что скорее желаемое поведение.)

параллельно ответ Уильяма Перселла, вот простая конструкция, которая должна работать даже в оригинальной оболочке V7 Bourne (и, следовательно, также в местах, где Bash недоступен).

i=0
while read line; do
    i=`expr "$i" + 1`
    case $i in 5) echo "$line"; break;; esac
done <file

обратите внимание также на оптимизацию до break из цикла, когда мы получили строку, которую мы искали.

легко с perl! Если вы хотите получить строки 1, 3 и 5 из файла, скажите /etc/passwd:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"