Jak liczyć wiersze w dokumencie?

1076

Mam takie linie i chcę wiedzieć, ile faktycznie mam linii ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

Czy istnieje sposób, aby policzyć je wszystkie za pomocą poleceń linux?

Alucard
źródło
4
Otwórz plik za pomocą vima, a następnie wpisz g <Ctrl-g>, pokaże ci liczbę wierszy, słów, kolumn i bajtów
Luv33preet
30
@ Luv33preet, a następnie po prostu wracasz do SO, szukając sposobu na wyjście z vima
Skylar Ittner
5
@SkylarIttner A jeśli musisz sprawdzić, jak wyjść z vima, <esc> :q!to jedyna odpowiedź. (To jest żart, to usunie wszystkie niezapisane zmiany - żartem jest to, że jeśli nie znasz vima, łatwo jest zepsuć plik, więc lepiej go nie zapisywać).
Ryan

Odpowiedzi:

2030

Użyj wc:

wc -l <filename>

Spowoduje to wyświetlenie liczby wierszy w <filename>:

$ wc -l /dir/file.txt
3272485 /dir/file.txt

Lub, aby pominąć <filename>wynik, użyj wc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

Możesz także przesyłać dane do wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63
użytkownik85509
źródło
18
to jest świetne!! możesz użyć awk, aby pozbyć się nazwy pliku dołączonej do numeru linii jako takiej:wc -l <file> | awk '{print $1}
CheeHow
80
Nawet krócej, możesz to zrobićwc -l < <filename>
Tensigh
5
@ GGB667 możesz także pozbyć się nazwy pliku za pomocącat <file> | wc -l
baptx
14
i watch wc -l <filename>możesz śledzić ten plik w czasie rzeczywistym. Jest to przydatne na przykład w plikach dziennika.
DarkSide
27
Uważaj, że wc -l liczy „nowe linie”. Jeśli masz plik z 2 liniami tekstu i jednym symbolem „nowej linii” między nimi, wc wyświetli „1” zamiast „2”.
Konstantin
140

Aby policzyć wszystkie linie, użyj:

$ wc -l file

Aby filtrować i liczyć tylko linie z wzorkiem, użyj:

$ grep -w "pattern" -c file  

Lub użyj -v, aby odwrócić dopasowanie:

$ grep -w "pattern" -c -v file 

Zobacz stronę man grep, aby zobaczyć argumenty -e, -i i -x ...

Lauro Oliveira
źródło
Dziwnie czasem grep -cdziała dla mnie lepiej. Głównie ze względu na wc -lirytujący prefiks „padu” dla padania.
MarkHu
75
wc -l <file.txt>

Lub

command | wc -l
John Kugelman
źródło
43

jest wiele sposobów. używanie wcjest jednym.

wc -l file

inne obejmują

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file
ghostdog74
źródło
3
Tak, ale wc -l filepodaje liczbę wierszy ORAZ nazwę pliku, aby uzyskać tylko nazwę pliku, którą możesz wykonać:filename.wc -l < /filepath/filename.ext
ggb667,
Użycie argumentu GNU grep -H zwraca nazwę pliku i liczbę. grep -Hc ".*" file
Zlemini
Głosowałem na to rozwiązanie, ponieważ wc -lliczy znaki nowego wiersza, a nie rzeczywiste wiersze w pliku. Wszystkie pozostałe polecenia zawarte w tej odpowiedzi podadzą ci odpowiednią liczbę na wypadek, gdybyś potrzebował linii.
growlingchaos
27

Narzędzie wcto „licznik słów” w systemach operacyjnych UNIX i podobnych do systemu UNIX, ale można go również używać do zliczania wierszy w pliku poprzez dodanie -lopcji.

wc -l foopoliczy liczbę linii w foo. Możesz także przesyłać dane wyjściowe z takiego programu:, ls -l | wc -lktóry powie ci, ile plików znajduje się w bieżącym katalogu (plus jeden).

zbudowany1n
źródło
3
ls -l | wc -l poda liczbę plików w katalogu +1 dla linii o całkowitym rozmiarze. możesz zrobić, ls -ld * | wc -laby uzyskać prawidłową liczbę plików.
Joshua Lawrence Austill
24

Jeśli chcesz sprawdzić całkowitą linię wszystkich plików w katalogu, możesz użyć find i wc:

find . -type f -exec wc -l {} +
storen
źródło
21

Użyj wc:

wc -l <filename>
Vivin Paliath
źródło
15

Jeśli wszystko czego potrzebujesz to liczba linii (a nie liczba linii i głupia nazwa pliku powracającego):

wc -l < /filepath/filename.ext

Jak wspomniano wcześniej, działają one również (ale są gorsze z innych powodów):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower
ggb667
źródło
3
Ta odpowiedź została opublikowana 3 lata po zadaniu pytania i jest po prostu kopiowaniem innych. Pierwsza część jest trywialna, a druga cała odpowiedź ghostdoga była dodana . Downvoting.
fedorqui „SO przestań krzywdzić”
4 lata później. Zobaczmy, czy uda nam się uzyskać dziesięcioletnią passę głosowania!
Damien Roche,
1
Nie, mylisz się; Odpowiedź ghostdog nie odpowiada na pierwotne pytanie. Podaje liczbę wierszy ORAZ nazwę pliku. Aby uzyskać tylko nazwę pliku, możesz: filename.wc -l </filepath/filename.ext. Dlatego opublikowałem odpowiedź. awk, sed i grep są nieco gorszymi sposobami na zrobienie tego. Właściwy sposób to ten, który wymieniłem.
ggb667,
8

Użyj w nlten sposób:

nl filename

Od man nl:

Zapisz każdy PLIK na standardowe wyjście z dodanymi numerami linii. Bez PLIKU lub gdy PLIK jest -, czytaj standardowe wejście.

dziesiętny
źródło
To pierwsza znaleziona przeze mnie odpowiedź, która działa z plikiem zawierającym pojedynczy wiersz tekstu, który nie kończy się na nowej linii, który ma wc -lwartość 0. Dziękuję.
Scott Joudry
7

Korzystałem z tego:

cat myfile.txt | wc -l

Wolę ją od zaakceptowanej odpowiedzi, ponieważ nie drukuje ona nazwy pliku i nie musisz awkjej naprawiać. Zaakceptowana odpowiedź:

wc -l myfile.txt

Ale myślę, że najlepsza jest odpowiedź GGB667:

wc -l < myfile.txt

Prawdopodobnie będę go teraz używać. Jest nieco krótszy niż moja droga. Poddaję swój stary sposób robienia tego na wypadek, gdyby ktoś go preferował. Dane wyjściowe są takie same dla tych dwóch metod.

Buttle Butkus
źródło
3
pierwsza i ostatnia metoda są takie same. ostatni jest lepszy, ponieważ nie odradza się dodatkowy proces
5

Powyżej znajduje się preferowana metoda, ale pomocne może być również polecenie „cat”:

cat -n <filename>

Pokaże całą zawartość pliku z numerami linii.

Jog
źródło
5

Widziałem to pytanie, gdy szukałem sposobu zliczania wielu linii plików, więc jeśli chcesz policzyć wiele linii pliku .txt, możesz to zrobić,

cat *.txt | wc -l

będzie również działać na jednym pliku .txt;)

talsibony
źródło
5

wc -l nie liczy linii.

Tak, ta odpowiedź może być nieco spóźniona na przyjęcie, ale nie znalazłem jeszcze nikogo, kto udokumentowałby bardziej solidne rozwiązanie w odpowiedziach.

Wbrew powszechnemu przekonaniu POSIX wcale nie wymaga, aby pliki kończyły się znakiem nowej linii. Tak, definicja linii POSIX 3.206 jest następująca:

Sekwencja zerowa lub większa niż <nazwa> znaków plus znak kończący.

Jednak wiele osób nie zdaje sobie sprawy, że POSIX definiuje również POSIX 3.195 Niekompletna linia jako:

Sekwencja jednego lub więcej znaków innych niż <lineline> na końcu pliku.

Dlatego pliki bez końcowego LFsą idealnie zgodne z POSIX.

Jeśli zdecydujesz się nie obsługiwać obu typów EOF, twój program nie będzie zgodny z POSIX.

Jako przykład przyjrzyjmy się poniższemu plikowi.

1 This is the first line.
2 This is the second line.

Bez względu na EOF, jestem pewien, że zgodziłbyś się, że istnieją dwie linie. Przekonałeś się, patrząc na to, ile linii zostało uruchomionych, a nie na ile linii zostało zakończonych. Innymi słowy, zgodnie z POSIX, oba te pliki mają taką samą liczbę linii:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

Strona podręcznika jest dość jasna, jeśli chodzi o wcliczenie nowych linii, przy czym nowa linia jest tylko 0x0apostacią:

NAME
       wc - print newline, word, and byte counts for each file

Dlatego wcnawet nie próbuje policzyć czegoś, co można nazwać „linią”. Używanie wcdo liczenia linii może bardzo dobrze prowadzić do błędnych rachunków, w zależności od EOF pliku wejściowego.

Rozwiązanie zgodne z POSIX

Możesz użyć grepdo zliczenia linii, tak jak w powyższym przykładzie. To rozwiązanie jest zarówno bardziej niezawodne, jak i precyzyjne, i obsługuje wszystkie różne smaki tego, czym może być linia w pliku:

$ grep -c ^ FILE
Chiru
źródło
4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+'W celu powrotu numery dwucyfrowe TYLKO .
AechoLiu
źródło
3
wc -l file.txt | cut -f3 -d" "

Zwraca tylko liczbę wierszy

Umur Kontacı
źródło
3

Przekierowanie / potokowanie danych wyjściowych pliku wc -lpowinno wystarczyć, jak poniżej:

cat /etc/fstab | wc -l

co zapewniłoby nie. tylko linii.

tk3000
źródło
3

Lub policz wszystkie wiersze w podkatalogach ze wzorcem nazwy pliku (np. Pliki dziennika ze znacznikami czasu w nazwie pliku):

wc -l ./**/*_SuccessLog.csv
jwebuser
źródło
2

Wiem, że to stare, ale wciąż: Policz przefiltrowane linie

Mój plik wygląda następująco:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

Jeśli chcę wiedzieć, ile plików jest wysyłanych, OK:

grep "OK" <filename> | wc -l

LUB

grep -c "OK" filename
Diego Fernando Villarroel Diaz
źródło
2

policz liczbę wierszy i zapisz wynik w zmiennej użyj tego polecenia:

count=$(wc -l < file.txt) echo "Number of lines: $count"

Konstantin F.
źródło
1

Jak powiedzieli inni, wc -ljest to najlepsze rozwiązanie, ale w przyszłości możesz użyć Perla:

perl -lne 'END { print $. }'

$.zawiera numer wiersza, a ENDblok wykona się na końcu skryptu.

Majid Azimi
źródło
1
Nie działa:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW
1
@VeikkoW Działa dla mnie. Jeśli korzystasz z systemu Windows, obowiązują inne reguły cytowania; ale OP zapytał o Linux / Bash.
tripleee
1
perl -lne '}{ print $. 'robi to samo.
Tom Fenech
1

Właśnie stworzyłem program, aby to zrobić (z node)

npm install gimme-lines
gimme-lines verbose --exclude=node_modules,public,vendor --exclude_extensions=html

https://github.com/danschumann/gimme-lines/tree/master

Funkodebat
źródło
4
Czy to nie jest jak użycie F16 do zabijania chwastów ogrodowych?
Buttle Butkus,
1

wc -l <filename>

To da ci liczbę wierszy i nazwę pliku wyjściowego.

Na przykład.

wc -l 24-11-2019-04-33-01-url_creator.log

Wynik

63 24-11-2019-04-33-01-url_creator.log

Posługiwać się

wc -l <filename>|cut -d\ -f 1

aby uzyskać tylko liczbę wierszy w danych wyjściowych.

Na przykład.

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

Wynik

63

Surowe Sarohi
źródło
Gdzie jest korzyść z powtórzenia zaakceptowanej (dziesięcioletniej) odpowiedzi?
jeb
Ponieważ nie mogłem znaleźć polecenia, aby uzyskać tylko numery wierszy w danych wyjściowych w tym wątku.
Harsh Sarohi
To drugi przykład w zaakceptowanej odpowiedzi. wc -l < filename
jeb
wc -l <nazwa pliku> podaje nazwę pliku oraz liczbę wierszy na wyjściu.
Harsh Sarohi
Nie, wc -l < filenameróżni się od tego wc -l filename, że najpierw używa przekierowania, a następnie w danych wyjściowych nie ma nazwy pliku, jak pokazano w odpowiedzi od user85509
jeb
1

Ta funkcja przenośnej powłoki [ℹ]   działa jak urok. Wystarczy dodać następujący fragment kodu do .bashrcpliku (lub odpowiednik środowiska powłoki) .

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

Powinno to być w pełni kompatybilne ze wszystkimi powłokami zgodnymi z POSIX, oprócz bash i zsh .

blizzrdof77
źródło