Jak sformatować dane wyjściowe grep, aby wyświetlały numery linii na końcu linii, a także liczbę trafień?


378

Używam grep, aby dopasować ciąg znaków w pliku. Oto przykładowy plik:

example one,
example two null,
example three,
example four null,

grep -i null myfile.txt zwroty

example two null,
example four null,

Jak mogę zwrócić dopasowane linie wraz z ich numerami linii, tak jak to:

  example two null, - Line number : 2
  example four null, - Line number : 4
  Total null count : 2

Wiem, że -c zwraca całkowitą liczbę pasujących linii, ale nie wiem, jak poprawnie sformatować, aby dodać total null countz przodu, i nie wiem, jak dodać numery linii.

Co mogę zrobić?

Odpowiedzi:


600

-n zwraca numer linii.

-ijest w przypadku ignorowania wielkości liter. Stosować tylko wtedy, gdy dopasowanie wielkości liter nie jest konieczne

$ grep -in null myfile.txt

2:example two null,
4:example four null,

Połącz z, awkaby wydrukować numer linii po meczu:

$ grep -in null myfile.txt | awk -F: '{print $2" - Line number : "$1}'

example two null, - Line number : 2
example four null, - Line number : 4

Użyj podstawienia polecenia, aby wydrukować całkowitą liczbę zerową:

$ echo "Total null count :" $(grep -ic null myfile.txt)

Total null count : 2

czy mogę to sformatować, dodając numery wierszy po zamiast przed za pomocą:?
Londyn,

Twoje rozwiązanie wydaje się w porządku, ale pojawia się błądawk95: syntax error at source line context is >>> ' <<< missing } awk95: bailing out at source line 1
Londyn,

przepraszam, przełączyłem się na Linuksa, teraz działa :) była to wersja systemu Windows niezbyt dobra
Londyn

1
... rycerze, którzy mówią -ni, że tak pamiętasz tę sztuczkę
santiago arizti

59

Użyj -nlub --line-number.

Sprawdź man grepwiele innych opcji.


3
nowy użytkownik Linuksa nie chce czytać strony podręcznika man. Ale jeśli użyją wystarczająco Linuksa, przywykną do niego :) Jest to bardzo przydatne :)
Dzung Nguyen

19
Nie zawsze leniwy (ale czasem), często nowy użytkownik Linuksa ma problem ze zrozumieniem strony podręcznika. (Mogą wydawać się tajemnicze)
TecBrat,

czasami strona podręcznika może zająć wiele stron. I trudno jest je wszystkie odczytać
Eugen Konkov

7

posługiwać się grep -n -i null myfile.txt aby wypisać numer linii przed każdym dopasowaniem.

Nie sądzę, aby grep miał przełącznik do drukowania liczby pasujących linii, ale możesz po prostu przesłać wyjście grep do wc, aby osiągnąć:

grep -n -i null myfile.txt | wc -l

3
-c wydrukuje wszystkie dopasowane linie
dpatchery

Masz rację. Niestety tłumi również normalną moc wyjściową.
jhenninger

7

Lub użyj awkzamiast tego:

awk '/null/ { counter++; printf("%s%s%i\n",$0, " - Line number: ", NR)} END {print "Total null count: " counter}' file

4

grepznajdź linie i wypisz numery linii, ale nie pozwala ci „programować” innych rzeczy. Jeśli chcesz dołączyć dowolny tekst i wykonać inne „programowanie”, możesz użyć awk,

$ awk '/null/{c++;print $0," - Line number: "NR}END{print "Total null count: "c}' file
example two null,  - Line number: 2
example four null,  - Line number: 4
Total null count: 2

Lub tylko przy użyciu powłoki (bash / ksh)

c=0
while read -r line
do
  case "$line" in
   *null* )  (
    ((c++))
    echo "$line - Line number $c"
    ;;
  esac
done < "file"
echo "total count: $c"

3

lub w perlu (dla kompletności ...):

perl -npe 'chomp; /null/ and print "$_ - Line number : $.\n" and $i++;$_="";END{print "Total null count : $i\n"}'


1

Pomyślałem, że w przyszłości mogę ci pomóc. Aby wyszukać wiele ciągów i numerów linii wyjściowych i przeglądać dane wyjściowe, wpisz:

egrep -ne 'null|three'

pokaże:

2:example two null,  
3:example three,  
4:example four null,   

egrep -ne 'null|three' | less

wyświetli wynik w krótszej sesji

HTH Jun

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.