/ / Як дізнатися кількість відображених рядків команди "cat"? - linux, bash, shell, sh

Як дізнатися кількість відображуваних рядків команди "cat"? - linux, bash, shell, sh

Як дізнатися кількість відображуваних рядків наступної команди "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 буде працювати з окремими файлами, декількома файлами та файлами, так що для цього немає необхідності кот.