/ / Come sapere il numero di righe visualizzate del comando "gatto"? - linux, bash, shell, sh

Come conoscere il numero di righe visualizzate del comando "gatto"? - linux, bash, shell, sh

Come conoscere il numero di righe visualizzate del seguente comando "cat"?

cat anyfile.txt | grep anypattern

utilizzando | wc -l eviterà la visualizzazione dell'output del comando. E voglio mantenere l'output displayd

risposte:

1 per risposta № 1

Ecco un modo per farlo usando ancora grep:

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

MODIFICA: per salvare il conteggio delle linee in una variabile di shell:

Metodo 1:

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

Metodo 2:

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

1 per risposta № 2

Senso unico:

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

1 per risposta № 3

Uso tee per reindirizzare in wc:

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

1 per risposta № 4
grep anypattern anyfile | tee /dev/stderr | wc -l

Questo condurrà l'output di grep a tee che poi lo scriverà entrambi sullo standard output stdout e errore standard stderre infine l'errore standard verrà visualizzato mentre l'output standard verrà collegato wc che mostrerà il numero di linee.


Esempio :

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

haystack
smokestack
stack
stacked
stacking
stack"s
stacks
7

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

l'espressione 1>&2 istruisce bash duplicare stdout (fd = 1) in modo che tutto ciò che è scritto dal comando precedente a stdout va a stderr (fd = 2) pure.

Poiché l'operatore di reindirizzamento | scrive tutto ciò che proviene da stdout al stdin del seguente comando vedi l'uscita di stderr sul terminale.


0 per risposta № 6

TL; DR

Il gatto comando concatena i file, quindi a meno che non si stia invocando cat su un singolo file (che è un file UUOC) i tuoi numeri di linea non significano nulla di utile comunque dopo che il primo file è stato letto. Puoi vederlo in prima persona in azione usando --number bandiera con GNU cat.

Uso gatto da GNU Coreutils

Se stai usando GNU cat, allora puoi semplicemente usare il --number bandiera. Per esempio:

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

Questo mostrerà l'output, insieme al suonumero di linea corrente nel flusso di output. Si noti che questo è interamente sequenziale: in questo esempio, anche se "due" è la prima riga del secondo file, è il numero due dell'output concatenato.

Utilizzare direttamente le bandiere di Grep

Se si utilizza GNU grep, è possibile ottenere facilmente nomi di file e numeri di riga per una raccolta di file. Ad esempio:

$ 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 gestirà singoli file, più file e file glob, quindi non è assolutamente necessario gatto.