Як дізнатися кількість відображуваних рядків наступної команди "cat"?
cat anyfile.txt | grep anypattern
Використовуючи | wc -l
уникне відображення виводу команди. І я хочу зберегти вивід displayd
Відповіді:
1 для відповіді № 1Ось один спосіб це зробити, використовуючи grep:
grep "anypattern" anyfile.txt | awk "END{print NR}1"
EDIT: Щоб зберегти кількість рядків у змінній оболонки:
Метод 1:
count=$(grep "anypattern" anyfile.txt | awk "END{print NR > "/dev/stderr"}1" 3>&1 1>&2 2>&3)
Метод 2:
grep "anypattern" anyfile.txt | awk "END{print NR > "/tmp/_temp"}1"
count=$(</tmp/_temp)
1 для відповіді № 2
Односторонній:
awk "/anypattern/{x++;print};END{print x}" anyfile.txt
1 для відповіді № 3
Використовуйте tee
перенаправити в wc
:
printf " line %dn" {1..4} | tee >(wc -l)
line 1
line 2
line 3
line 4
4
1 для відповіді № 4
grep anypattern anyfile | tee /dev/stderr | wc -l
Це буде проводити вихід з grep
до tee
який потім буде писати його як до стандартного виводу stdout
і стандартна помилка stderr
, і, нарешті, стандартна помилка з'являтиметься, коли стандартний вивід буде отримати wc
який буде відображати кількість рядків.
Приклад:
grep stack /usr/share/dict/cracklib-small | tee /dev/stderr | wc -l
haystack
smokestack
stack
stacked
stacking
stack"s
stacks
7
0 для відповіді № 5
grep anypattern anyfile.txt 1>&2 | wc -l
вираз 1>&2
наставляє bash
дублювати stdout
(fd = 1) таким чином, що все, що написано з попередньої команди до stdout
прямує до stderr
(fd = 2).
Оскільки оператор перенаправлення |
пише все, що походить від stdout
до stdin
з наступної команди ви бачите виведення з stderr
на терміналі.
0 для відповіді № 6
TL; DR
The кот Команда об'єднує файли, тому, якщо ви не називаєте кота на одному файлі (який є UUOC) ваші номери рядків не означають щось корисне в будь-якому випадку після прочитання першого файлу. Ви можете побачити це в дії з перших рук, використовуючи --number
прапорець GNU cat.
Використовуйте кот з GNU Coreutils
Якщо ви використовуєте GNU cat, то ви можете просто скористатись --number
прапор Наприклад:
$ cat --number <(echo one) <(echo two)
1 one
2 two
Це покаже вихідний файл разом із йогопоточний номер рядка у вихідному потоці. Зауважте, що це цілком послідовно: у цьому прикладі, навіть якщо "two" є першим рядком другого файлу, це рядок номер два з об'єднаного виводу.
Використовуйте Grep Flags безпосередньо
Якщо ви використовуєте GNU grep, ви можете легко отримати назви файлів і рядків для колекції файлів. Наприклад:
$ grep --line-number --with-filename root /etc/passwd /etc/group
/etc/passwd:1:root:x:0:0:root,,,:/root:/bin/bash
/etc/group:1:root:x:0:
GNU grep буде працювати з окремими файлами, декількома файлами та файлами, так що для цього немає необхідності кот.