как выполнить grep для «включить» и «исключить другой термин» из файла?

как выполнить grep для «включить» и «исключить другой термин» из файла?

Я пытаюсь построить поиск grep, который должен включать термин и исключать другой термин. Я пытаюсь использовать несколько опций -E "pattern", но это не сработало.

Вот пример команды, которую я попробовал.

grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv

но выходные результаты соответствуют только второму ограничению grep -Eiv "10.10.210.154"

решение1

Предположим, вы хотите найти \,17\:31, но не по IP10\.10\.210\.154

Вы можете это использовать.

grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154" 

решение2

Примечание:другой ответдолжно работать, но это ничего не объясняет; отсюда мой пояснительный ответ.

Вы сказали второму grepпрочитать file.csv, так оно и делает. Он игнорирует свой стандартный ввод, потому что это то, что grepон делает, когда работает с файлом(ами).

По сути, второй grepдействует так, как будто первого не было. Он завершает работу после обработки файла и вывода его результатов (если таковые имеются).

Первый grepожидает ввода (обычно с клавиатуры, если запущен в интерактивной оболочке). Он может принимать много строк и даже печатать много (совпадающих) строк на свой стандартный вывод, пока буфер канала не решит передать вывод второму grep. Затем, если второй grepбольше нет, первый grepуведомляется о том, что канал разорван; он завершает работу.

Или вы можете нажать Ctrl+ D, чтобы обозначить конец ввода; или вы можете нажать Ctrl+ C, чтобы убить первый grep(и второй, если он еще жив). Но это не исправит ваш поток данных.

Правильный поток данных выглядит так: первый должен grepпрочитать файл, а затем передать результат второму:

grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"

Последний синтаксис имеет по крайней мере одно преимущество, которое объясняется в концеэто еще один мой ответ.

Связанный контент