Я пытаюсь построить поиск 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"
Последний синтаксис имеет по крайней мере одно преимущество, которое объясняется в концеэто еще один мой ответ.