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?


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

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 ...


Dziwnie czasem grep -cdziała dla mnie lepiej. Głównie ze względu na wc -lirytujący prefiks „padu” dla padania.
MarkHu


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

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).


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 {} +


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

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.


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.


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.


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;)


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

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+'W celu powrotu numery dwucyfrowe TYLKO .


3

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

cat /etc/fstab | wc -l

co zapewniłoby nie. tylko linii.


3

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

wc -l ./**/*_SuccessLog.csv

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

2

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

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


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.


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

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


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.