Команда для получения n-й строки STDOUT - PullRequest
180 голосов
/ 16 сентября 2009

Есть ли какая-нибудь команда bash, которая позволит вам получить n-ю строку STDOUT?

То есть что-то, что могло бы принять это

$ ls -l
-rw-r--r--@ 1 root  wheel my.txt
-rw-r--r--@ 1 root  wheel files.txt
-rw-r--r--@ 1 root  wheel here.txt

и сделайте что-то вроде

$ ls -l | magic-command 2
-rw-r--r--@ 1 root  wheel files.txt

Я понимаю, что это будет плохой практикой, когда пишу сценарии, предназначенные для повторного использования, НО при работе с оболочкой изо дня в день мне было бы полезно иметь возможность фильтровать свой STDOUT таким способом.

Я также понимаю, что это была бы полувысокая команда для записи (буфер STDOUT, возвращает определенную строку), но я хочу знать, есть ли какая-нибудь стандартная команда оболочки, чтобы сделать это, которая будет доступна без я бросаю сценарий на место.

Ответы [ 13 ]

0 голосов
/ 20 июля 2012

Хм

sed не работает в моем случае. Я предлагаю:

для "нечетных" строк 1,3,5,7 ... ls | awk '0 == (NR + 1)% 2'

для "четных" строк 2,4,6,8 ls | awk '0 == (NR)% 2'

0 голосов
/ 16 сентября 2009

Да, самый эффективный способ (как уже отметил Джонатан Леффлер) - это использовать sed с print & quit:

set -o pipefail                        # cf. help set
time -p ls -l | sed -n -e '2{p;q;}'    # only print the second line & quit (on Mac OS X)
echo "$?: ${PIPESTATUS[*]}"            # cf. man bash | less -p 'PIPESTATUS'
0 голосов
/ 16 сентября 2009

Для большей полноты ..

ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)

Выбрасывайте строки, пока не дойдете до второй, затем распечатайте первую строку после этого. Итак, печатается 3-я строка.

Если это просто вторая строка ..

ls -l | (read; head -n1)

Положите столько прочитанных, сколько необходимо.

...