Використовуйте diff, щоб знайти різницю у виведенні двох команд grep


2

Чи можливий diffвихід двох grepкоманд?

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

Чи можна якось передати дві grepкоманди в diffщось таке чи таке?

grep --exclude=*{.dll, pdb} --ril "dql"
grep  --ril "dql"

Перенаправити grepвихід на 2 файли, а потім diffна файли.
DavidPostill

Прочитайте, будь ласка, MCVE
Жиль-Кінот

@DavidPostill Це була моя початкова ідея, але я хотів дізнатися, чи є акуратніший "трюк", а не створення тимчасових файлів, і diffтих.
Я не жир

Відповіді:


1

У 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 застарілий, а в деяких випадках просто неправильний.
Жилль Кінот

Це лише перший результат, який з’явився, я також додав уривок з man bash.
Аркадіуш Драбчик

Будь ласка, ніколи не посилайте tldp. Це не тому, що це найрелевантніше перший з ваших пошуків. mywiki.wooledge.org/ProcessSubstitution - це набагато краще місце, насправді
Жиль Квенот

Чи можете ви навести приклад, коли TLDPце неправильно чи застаріло? Я ніколи не використовував його для навчання, але все-таки це може бути корисно знати.
Аркадіуш Драбчик

Запитайте greybot !tldpна irc #bash@irc.freenode.orgта хлопців позаду. Якщо ви хочете гарних ресурсів: FAQ: mywiki.wooledge.org/BashFAQ | Посібник: mywiki.wooledge.org/BashGuide | Посилання: gnu.org/s/bash/manual | wiki.bash-hackers.org | mywiki.wooledge.org/Quotes | Перевірте свій сценарій: shellcheck.net
Квілль Жиля

1

Використання на льоту :

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: extra operand / dev / fd / 61'`
я не жир

-bash: 0: неоднозначне перенаправлення
я не жир

Я думаю, що ти зробив помилку на
друк

не впевнений, де хоч .. diff <(grep --exclude=*.{dll,pdb,svg,DS_Store,exe,zip,tdf,Oracle,sql,cache,txt,cfs,fnm,log,css,xdt,psm1} -ril "del" .) <(grep --exclude=*.{dll,pdb,svg,DS_Store,exe,zip,tdc,Oracle,sql,cache,txt,cfs,fnm,log,css,xdt,psm1} -ril "del" .)
Я не жир
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.