Kent, grep --versionczy to polecenie, którego należy użyć, aby poznać wersję grep? Jeśli tak, to nie działa. Nie można znaleźć żadnego innego polecenia, aby poznać wersję grep.
Vivek,
2
dobre pytanie, ale „wersja Os” to myląca przykładowa nazwa pliku
HaveAGuess
1
System operacyjny i wersja nie mają tu znaczenia.
MD XF
grep 'pattern' *
użytkownik0
Odpowiedzi:
430
Wypróbuj tę małą sztuczkę, aby grepprzekonać się, że ma do czynienia z wieloma plikami, aby wyświetlała nazwę pliku:
Tak, zadziałało. Czy możesz mi powiedzieć, jakie znaczenie ma dodanie /dev/nulltego polecenia?
Vivek,
55
Jeśli grepjest dostarczany z wieloma nazwami plików, automatycznie wyświetli nazwy plików przed dopasowaniem, ale pozostawi nazwę pliku w przypadku pojedynczego pliku wejściowego. Używając /dev/nulljako dodatkowego pliku wejściowego grep„myśli”, że zajmuje się wieloma plikami, ale / dev / null jest oczywiście pusty, więc nie pojawi się na liście meczów.
Scrutinizer
32
użycie / dev / null to sprytna sztuczka, ale myślę, że lepsza odpowiedź to podana poniżej opcja -H.
JohnQ
22
OK, ale -Hopcja grep nie jest częścią POSIX, a używany system operacyjny to Solaris 10, w którym ani standardowa wersja grep, ani zgodna z POSIX wersja grep nie mają takiej -Hopcji.
Skrutinizer,
4
Jest to ważne, jeśli używasz grep z find, na przykład find . -name foo -exec grep pattern {} \;- zakładając, że foow katalogu znajduje się wiele plików o nazwie z podkatalogu, findnadal przekazujesz grepjeden plik do działania na raz. Ta /dev/nullsztuczka wydaje się działać we wszystkich wersjach linux / osx, których próbowałem, więc chwała! Uwaga: Myślę, że -Hjest to czystsze, ale jak wspomniano poniżej, może nie być obsługiwane przez twoją wersję grep.
Jon V
296
Jeśli masz dostępne opcje -Hi jest -ndostępny ( man grepjest twoim przyjacielem):
@codeforester Nie znam żadnych innych grep, więc nie wiem.
MD XF,
2
Chłodny ! działało to w systemie Linux. jeśli używasz Maca, możesz zainstalować coreutils z naparami. I pamiętaj, aby dodać PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" do
Działa dla mnie z wbudowanym gre gre (2.5.1-FreeBSD). Ale aby użyć alternatywnego grep z Homebrew, innym sposobem jest uruchomienie, brew install grepa następnie użycie ggrep. Nie trzeba modyfikować ŚCIEŻKI.
wonderlr
5
Co powiesz na to, co udało mi się osiągnąć, częściowo dzięki temu postowi.
Chcesz znaleźć kilka plików, powiedzmy logi o różnych nazwach, ale wzorcu (np. filename=logfile.DATE), W kilku katalogach ze wzorcem (np /logsapp1, /logsapp2.). Każdy plik ma wzorzec, który chcesz grepować (np. "init time") I chcesz mieć "init time"każdy z nich, ale wiedząc, do którego pliku należy.
grep --version
grep --version
czy to polecenie, którego należy użyć, aby poznać wersję grep? Jeśli tak, to nie działa. Nie można znaleźć żadnego innego polecenia, aby poznać wersję grep.grep 'pattern' *
Odpowiedzi:
Wypróbuj tę małą sztuczkę, aby
grep
przekonać się, że ma do czynienia z wieloma plikami, aby wyświetlała nazwę pliku:Aby uzyskać także numer linii:
źródło
/dev/null
tego polecenia?grep
jest dostarczany z wieloma nazwami plików, automatycznie wyświetli nazwy plików przed dopasowaniem, ale pozostawi nazwę pliku w przypadku pojedynczego pliku wejściowego. Używając/dev/null
jako dodatkowego pliku wejściowegogrep
„myśli”, że zajmuje się wieloma plikami, ale / dev / null jest oczywiście pusty, więc nie pojawi się na liście meczów.-H
opcja grep nie jest częścią POSIX, a używany system operacyjny to Solaris 10, w którym ani standardowa wersja grep, ani zgodna z POSIX wersja grep nie mają takiej-H
opcji.find . -name foo -exec grep pattern {} \;
- zakładając, żefoo
w katalogu znajduje się wiele plików o nazwie z podkatalogu,find
nadal przekazujeszgrep
jeden plik do działania na raz. Ta/dev/null
sztuczka wydaje się działać we wszystkich wersjach linux / osx, których próbowałem, więc chwała! Uwaga: Myślę, że-H
jest to czystsze, ale jak wspomniano poniżej, może nie być obsługiwane przez twoją wersjęgrep
.Jeśli masz dostępne opcje
-H
i jest-n
dostępny (man grep
jest twoim przyjacielem):Opcje:
-H
jest rozszerzeniem GNU, ale-n
jest określone przez POSIXźródło
-H
tutaj nie jest obsługiwane.Żadna sztuczka nie jest konieczna.
Z numerami linii:
źródło
grep
, więc nie wiem.brew install grep
a następnie użycieggrep
. Nie trzeba modyfikować ŚCIEŻKI.Co powiesz na to, co udało mi się osiągnąć, częściowo dzięki temu postowi.
Chcesz znaleźć kilka plików, powiedzmy logi o różnych nazwach, ale wzorcu (np.
filename=logfile.DATE
), W kilku katalogach ze wzorcem (np/logsapp1, /logsapp2
.). Każdy plik ma wzorzec, który chcesz grepować (np."init time"
) I chcesz mieć"init time"
każdy z nich, ale wiedząc, do którego pliku należy.Wtedy
outputfilename.txt
byłoby coś takiegoOgólnie
Wyjaśnienie:
find
polecenie przeszuka nazwy plików na podstawie wzorcanastępnie potok
xargs -I{}
przekieruje danefind
wyjściowe do pliku{}
który będzie wejściowy dla
grep ""pattern" {}
Następnie sztuczka, aby
grep
wyświetlić nazwy plików\dev\null
i na koniec zapisz wynik w pliku za pomocą
tee outputfile.txt
To działało dla mnie w
grep
wersji 9.0.5 kompilacji 1989.źródło
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Jest to niewielka modyfikacja poprzedniego rozwiązania. Mój przykład szuka przekierowania stderr w skryptach bash:
grep '2>' $(find . -name "*.bash")
źródło
pracował dla mnie, aby przeszukać wszystkie pliki .txt (oczywiście wprowadź własną wartość wyszukiwania).
źródło