ГРЭП:Как найти значение, но в то же время исключить некоторые совпадения

StackOverflow https://stackoverflow.com/questions/1802233

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

awk '<*> !~ /PHHIABFFH|Stats/ && /SEARCHTERM/' server.log

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

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

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

grep 'SEARCHTERM' server.log | grep -v -e 'PHHIABFFH' -e 'Stats'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top