2014-09-20 11 views

risposta

18

Il comando:

wc -l file.txt 

genererà un output simile:

42 file.txt 

con wc utilmente che indica il nome del file pure. Lo fa nel caso in cui si sta controllando un sacco di file in una sola volta e vogliono individuale così come le statistiche totali:

pax> wc -l *.txt 
973 list_of_people_i_must_kill_if_i_find_out_i_have_cancer.txt 
    2 major_acheivements_of_my_life.txt 
975 total 

si può fermare wc dal fare questo fornendo i suoi dati sul standard input, in modo che doesn 't conosce il nome del file:

if [[ $(wc -l <file.txt) -ge 2 ]] 

la seguente trascrizione mostra in azione:

pax> wc -l qq.c 
26 qq.c 

pax> wc -l <qq.c 
26 

Come nota a parte, noterai che sono passato a utilizzare [[ ]] e $().

Preferisco il primo perché ha meno problemi a causa della compatibilità con le versioni precedenti (principalmente con la suddivisione di stringhe) e il secondo perché è molto più facile nidificare eseguibili.

2
if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ] 
... 

Si dovrebbe sempre controllare cosa restituisce ciascun sottocomando. Comando wc -l file.txt restituisce in uscita nel seguente formato:

12 file.txt 

devi prima colonna - è possibile estrarre con awk o cut o qualsiasi altra utilità di vostra scelta.

5

A bash pura (≥4) possibilità utilizzando mapfile:

#!/bin/bash 

mapfile -n 2 < file.txt 
if ((${#MAPFILE[@]}>1)); then 
    echo "This file has more than 1 line." 
fi 

I mapfile memorizza built ciò che legge da stdin in un array (MAPFILE di default), una linea per campo. L'utilizzo di -n 2 lo fa leggere al massimo due righe (per l'efficienza). Successivamente, è sufficiente verificare se l'array MAPFILE ha più quel campo. Questo metodo è molto efficiente.

Come sottoprodotto, la prima riga del file viene memorizzata in ${MAPFILE[0]}, nel caso sia necessario. Scoprirai che il carattere finale non è tagliato.Se è necessario rimuovere il carattere di nuova riga finale, utilizzare l'opzione -t:

mapfile -t -n 2 < file.txt 
4

ne dite:

if read -r && read -r 
then 
    echo "This has more than 1 line." 
fi < file.txt 

è necessaria Il flag -r per garantire i caratteri di continuazione di linea non piegare due linee in una sola , che causerebbe il seguente file per segnalare solo una riga:

This is a file with _two_ lines, \ 
    but will be seen as one. 
+0

+1 La risposta più semplice. – chepner

+0

@paxdiablo Sei corretto. Grazie. Si potrebbe discutere se due linee in cui il primo termina in una barra rovesciata dovrebbero essere considerate come una riga, poiché ciò dovrebbe essere definito dall'applicazione. Ma dal momento che 'wc -l' ignora il backslash dovrebbe essere ignorato anche qui. – Scrutinizer

Problemi correlati