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

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

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

cat file | while read line
    do
       #do something
    done

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

Ответ 1

СЭД:

sed '5!d' file

AWK:

awk 'NR==5' file

Ответ 2

Предполагая, что 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

Ответ 3

Вы можете использовать sed -n 5p file.

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

Ответ 4

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

sed '5q;d' file

Ответ 5

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

head -n 20 york.txt | tail -11

или

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

p в приведенной выше команде означает печать.

Здесь вы увидите: введите описание изображения здесь

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd

Ответ 9

line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"