/ / Jak poznać liczbę wyświetlanych linii polecenia "cat"? - Linux, bash, shell, sh

Jak poznać liczbę wyświetlanych linii polecenia "cat"? - Linux, bash, shell, sh

Jak poznać liczbę wyświetlanych linii następującego polecenia "cat"?

cat anyfile.txt | grep anypattern

Za pomocą | wc -l pozwoli uniknąć wyświetlania wyniku polecenia. I chcę zachować dane wyjściowe displayd

Odpowiedzi:

1 dla odpowiedzi № 1

Oto jeden sposób zrobienia tego przy jednoczesnym użyciu grep:

grep "anypattern" anyfile.txt | awk "END{print NR}1"

EDYCJA: Aby zapisać liczbę linii w zmiennej powłoki:

Metoda 1:

count=$(grep "anypattern" anyfile.txt | awk "END{print NR > "/dev/stderr"}1" 3>&1 1>&2 2>&3)

Metoda 2:

grep "anypattern" anyfile.txt | awk "END{print NR > "/tmp/_temp"}1"
count=$(</tmp/_temp)

1 dla odpowiedzi nr 2

Jednokierunkowa:

awk "/anypattern/{x++;print};END{print x}" anyfile.txt

1 dla odpowiedzi nr 3

Posługiwać się tee przekierować do wc:

printf "    line %dn" {1..4} | tee >(wc -l)
    line 1
line 2
line 3
line 4
4

1 dla odpowiedzi nr 4
grep anypattern anyfile | tee /dev/stderr | wc -l

Spowoduje to wyprowadzenie wyniku grep do tee które następnie wypisze to na standardowe wyjście stdout i standardowy błąd stderr, a na końcu zostanie wyświetlony błąd standardowy, podczas gdy standardowe wyjście zostanie podłączone do potoków wc który wyświetli liczbę linii.


Przykład:

grep stack /usr/share/dict/cracklib-small | tee /dev/stderr | wc -l

haystack
smokestack
stack
stacked
stacking
stack"s
stacks
7

0 dla odpowiedzi № 5
grep anypattern anyfile.txt 1>&2 | wc -l

ekspresja 1>&2 instruuje bash duplikować stdout (fd = 1) w sposób, w jaki wszystko, co jest napisane od poprzedniego polecenia, do stdout idzie do stderr (fd = 2).

Od operatora przekierowania | pisze wszystko, co pochodzi od stdout do stdin następującego polecenia zobaczysz ouput of stderr na terminalu.


0 dla odpowiedzi № 6

TL; DR

The kot komenda konkatenuje pliki, więc jeśli nie wywołasz cat na pojedynczym pliku (który jest UUOC) Twoje numery linii nie będą oznaczać niczego użytecznego po przeczytaniu pierwszego pliku. Możesz to zobaczyć w akcji z pierwszej ręki, używając --number flaga z GNU cat.

Posługiwać się kot od GNU Coreutils

Jeśli używasz GNU cat, możesz po prostu użyć --number flaga. Na przykład:

$ cat --number <(echo one) <(echo two)
1  one
2  two

To wyświetli wynik wraz z jegonumer bieżącego wiersza w strumieniu wyjściowym. Zauważ, że jest to całkowicie sekwencyjne: w tym przykładzie, mimo że "dwa" jest pierwszym wierszem drugiego pliku, jest to drugi wiersz połączonego wyjścia.

Używaj bezpośrednio flag Grep

Jeśli używasz GNU grep, możesz łatwo uzyskać nazwy plików i numery linii dla zbioru plików.

$ 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 obsłuży pojedyncze pliki, wiele plików i pliki globs, więc nie ma w ogóle potrzeby kot.