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 № 1Ecco 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 stderr
e 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.