Используйте diff, чтобы найти разницу в выводе двух команд grep

747
I am not Fat

Возможен ли diffвывод двух grepкоманд?

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

Можно ли как-то передать две grepкоманды в diffили что-то подобное?

grep --exclude=*{.dll, pdb} --ril "dql" grep --ril "dql" 
2
Перенаправьте вывод `grep` в 2 файла, а затем` diff`. DavidPostill 6 лет назад 0
Пожалуйста, прочитайте [MCVE] (https://stackoverflow.com/help/mcve) Gilles Quenot 6 лет назад 0
@DavidPostill Это была моя первоначальная идея, но я хотел знать, был ли более аккуратный «трюк», а не создавать временные файлы, и «различать» их. I am not Fat 6 лет назад 0

2 ответа на вопрос

1
Arkadiusz Drabczyk

При bashиспользовании процесса подстановки :

$ echo a > FILE $ echo b > FILE1 $ diff <(grep a *) <(grep b *) 1c1 < FILE:a --- > FILE1:b 

Как описано в man bash:

 Process Substitution Process substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files. It takes the form of <(list) or >(list). The process list is run with its input or output connected to a FIFO or some file in /dev/fd. The name of this file is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will provide input for list. If the <(list) form is used, the file passed as an argument should be read to obtain the output of list.  When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic expansion. 
руководство tldp bash устарело, а в некоторых случаях просто неправильно. Gilles Quenot 6 лет назад 0
Это только первый результат, который я обнаружил, я также добавил отрывок из «man bash». Arkadiusz Drabczyk 6 лет назад 0
Пожалуйста, никогда не связывайте tldp. Это не потому, что это первый из вашего поиска, который является наиболее актуальным. http://mywiki.wooledge.org/ProcessSubstitution - это действительно лучшее место, правда Gilles Quenot 6 лет назад 0
Не могли бы вы привести пример, когда `TLDP` ошибочен или устарел? Я никогда не использовал это, чтобы учиться, но все же это может быть полезно знать. Arkadiusz Drabczyk 6 лет назад 0
Спросите greybot `! Tldp` на irc` # bash @ irc.freenode.org` и парнях позади. Если вы хотите хорошие ресурсы: FAQ: http://mywiki.wooledge.org/BashFAQ | Руководство: http://mywiki.wooledge.org/BashGuide | Ссылка: http://gnu.org/s/bash/manual | http://wiki.bash-hackers.org/ | http://mywiki.wooledge.org/Quotes | Проверьте ваш скрипт: http://www.shellcheck.net/ Gilles Quenot 6 лет назад 0
0
Gilles Quenot

Использование на лету :

diff <(grep pattern file) <(grep another_pattern file) 

Подстановка процесса: <(command)или >(command)заменяется записью FIFO или / dev / fd / *. В основном сокращение для настройки именованного канала. Смотрите http://mywiki.wooledge.org/ProcessSubstitution .
Пример:diff -u <(sort file1) <(sort file2)

Так :

diff <(grep --exclude=*{.dll, pdb} --ril "dql") <(grep --ril "dql") 
хммм ... я получаю сообщение об ошибке `diff: дополнительный операнд` / dev / fd / 61'` I am not Fat 6 лет назад 0
-bash: 0: неоднозначное перенаправление I am not Fat 6 лет назад 0
Я думаю, что вы сделали опечатку Gilles Quenot 6 лет назад 0
хотя не уверен, где .. `diff <(grep --exclude = *. -ril "del".) <(grep --exclude = *. -ril "del".) ` I am not Fat 6 лет назад 0