ГРЭП:Как найти значение, но в то же время исключить некоторые совпадения
Вопрос
Мне нужен способ упростить эту команду:
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'