Есть ли какая-нибудь команда 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, возврат определенной строки), но я хочу знать, есть ли какая-нибудь стандартная команда оболочки для этого, которая была бы доступна без того, чтобы я не бросил скрипт на место.
magic-command
Ответы:
Использование
sed
, только для разнообразия:Использование этой альтернативы, которая выглядит более эффективной, поскольку она прекращает чтение ввода при печати требуемой строки, может генерировать SIGPIPE в процессе подачи, что, в свою очередь, может генерировать нежелательное сообщение об ошибке:
Я видел это достаточно часто, поэтому я обычно использую первое (что легче вводить, во всяком случае), хотя
ls
это не команда, которая жалуется, когда получает SIGPIPE.Для ряда строк:
Для нескольких диапазонов линий:
источник
p
этоsed
оператор, который печатает строки, идентифицированные диапазоном строк, предшествующих ему. Таким образом,2,4p
означает печатать строки 2, 3, 4.n
значит НЕ печатать все остальные строкиисточник
head -n 2 | tail -n 1
- современные головы и хвосты имеют тенденцию выдавать предупреждения иначе.head -n M | tail -n M-N+1
), а обобщение для обработки нескольких диапазонов невозможно.$ ls -l | awk '{if (NR>=4 && NR<=64) print}'
(можно добавить больше условий, несколько диапазонов и т. Д.)Альтернатива хорошему способу головы / хвоста:
или
источник
'2p'
?2
переменная? В каждом примере используются одинарные кавычки, но для переменной var нужны двойные кавычки. Можем ли мы "запрограммировать" awk для работы с одинарными кавычками при использовании vars? Примерline =1; ls | awk 'NR==$line'
. Я знаю, чтоbash
использует двойные кавычки с переменными.От sed1line :
Из awk1line :
источник
Ради полноты ;-)
более короткий код
короче жизнь
источник
ls
- оригинальный вопрос был о чьем-тоSTDOUT
, поэтому я подумал, что лучше иметь его побольше.{ print $0 }
, поэтому awk NR == 3 - более короткий способ написать то же самое.Попробуйте эту
sed
версию:Он говорит: «удали все строки, которые не являются вторыми».
источник
Вы можете использовать awk:
Обновить
Приведенный выше код не получит то, что нам нужно, из-за ошибки off-by-one: первая строка команды ls -l - это общая строка. Для этого будет работать следующий пересмотренный код:
источник
Perl легко доступен для вас?
Очевидно, замените любое число на 7.
источник
$ awk 'NR % 7' filename
чтобы напечатать каждую 7-ю строку в файле.Другой постер предложил
но если вы направите трубку в хвост, похоже, что все до строки N обрабатывается дважды.
Трубный хвост в голову
будет более эффективным?
источник
Да, наиболее эффективный способ (как уже указывал Джонатан Леффлер) - это использовать sed с print & quit:
источник
Хмм
Сед не работал в моем случае. Я предлагаю:
источник
Для большей полноты ..
Выбрасывайте строки, пока не дойдете до второй, затем распечатайте первую строку после этого. Итак, печатается 3-я строка.
Если это просто вторая строка ..
Положите столько прочитанных, сколько необходимо.
источник
Я добавил это в свой .bash_profile
И это работает
источник