GREP: Как искать значение, но в то же время исключать некоторые совпадения - PullRequest
3 голосов
/ 26 ноября 2009

Мне нужен способ упростить эту команду:

grep 'SEARCHTERM' server.log | grep -v 'PHHIABFFH' | grep -v 'Stats'

Он должен найти все строки, включая SEARCHTERM, но исключить, если одна из SEARCHTERM строк включает PHHIABFFH или Stats.

Ответы [ 5 ]

6 голосов
/ 26 ноября 2009

Почему вы хотите «упростить» эту трубу? Un * x инструменты командной строки созданы таким образом.

Редактировать

В некоторых ответах предлагается использовать функции определенных версий grep. Мне это нравится, но вполне возможно, что такие специфические функции отсутствуют в версии grep, используемой OP.

Так что, пока мы не знаем, в какой среде работает ОП и какую версию какого инструмента он может использовать, я предлагаю придерживаться общих особенностей, присутствующих во всех версиях используемых инструментов.

Это снова прекрасно иллюстрирует философию Un * x.

Легко недооценить силу объединения каналов и перенаправления. В качестве поучительного примера Unix Shell As 4GL [Schaffer-Wolf] показывает, что с этими средствами в качестве основы можно объединить несколько простых утилит для поддержки создания и управления реляционными базами данных, выраженными в виде простых текстовых таблиц.

http://www.catb.org/~esr/writings/taoup/html/ch07s02.html#plumbing

5 голосов
/ 26 ноября 2009

Это будет работать:

grep 'SEARCHTERM' server.log | grep -Ev 'PHHIABFFH|Stats'
1 голос
/ 26 ноября 2009

Если простое означает просто одну команду с большим количеством аргументов ...

awk '$0 !~ /PHHIABFFH|Stats/ && /SEARCHTERM/' server.log
0 голосов
/ 26 ноября 2009

Я бы просто сделал это:

grep 'SEARCHTERM' server.log | grep -v -e 'PHHIABFFH' -e 'Stats'
0 голосов
/ 26 ноября 2009

вы можете просто использовать оболочку

while read -r line
do
   case "$line" in
    *"Stats"*|*"PHHIABFFH"*) continue;;
    *"SEARCHTERM"* ) echo "$line";;
   esac
done < "file"
...