Ответ 1
СЭД:
sed '5!d' file
AWK:
awk 'NR==5' file
Я пытаюсь получить определенную строку из текстового файла.
До сих пор в Интернете я видел только такие вещи, как sed (я могу использовать только sh -not bash или sed или что-то в этом роде). Мне нужно сделать это только с помощью базовой оболочки script.
cat file | while read line
do
#do something
done
Я знаю, как перебирать строки, как показано выше, но что, если мне просто нужно получить содержимое определенной строки
СЭД:
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
в приведенной выше команде означает печать.
Стандартный способ сделать это - использовать внешние инструменты. Запрет на использование внешних инструментов при написании оболочки script абсурден. Однако, если вы действительно не хотите использовать внешние инструменты, вы можете распечатать строку 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:}"