Получить конкретную строку из текстового файла, используя только скрипт
Я пытаюсь получить определенную строку из текстового файла.
до сих пор в Интернете я видел только такие вещи, как sed, (я могу использовать только sh-not bash или sed или что-то в этом роде). Мне нужно сделать это только с помощью базового сценария оболочки.
cat file | while read line
do
#do something
done
Я знаю, как перебирать строки, как показано выше, но что делать, если мне просто нужно получить содержимое конкретной строки
9 ответов:
предполагая, что
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
.
стандартный способ сделать это-использовать внешние инструменты. Запрещение использования внешних инструментов при написании сценария оболочки абсурдно. Однако, если вы действительно не хотите использовать внешние инструменты, вы можете распечатать строку 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
из цикла, когда мы получили строку, которую мы искали.