Как сделать эквивалент предложения "где" с `find` и `grep`

Я не вижу в вашем примере ничего, что бы вы делали для установки заголовка from.

echo test | mailx -S smtp=mail.sap.corp -s "test" -v -r venkatesh.vishwanatham@aaa.com venkatesh.vishwanatham@aaa.com

Если ваша версия mailxподдерживает -rдля установки адреса отправителя, вы можете добавить эту опцию.

Если это не так, попробуйте вариант ниже. Первый экземпляр адреса электронной почты для venkatesh.vishwanatham будет использоваться в качестве получателя. Передача -- -f <address>должна привести к тому, что mailx проигнорирует эту опцию и передаст ее непосредственно почтовой программе.

Вариант 2:

echo test | mailx -S smtp=mail.sap.corp -s "test" -v venkatesh.vishwanatham@aaa.com -- -f venkatesh.vishwanatham@aaa.com
3
27.03.2020, 13:51
5 ответов

Попробуйте awkвместо catиgrep

find. -type f | xargs awk '/abc/{printf "%s is from %s\n", $0, FILENAME}'

Или просто используйте findиawk

find. -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +
2
19.03.2021, 02:31

Grep принимает несколько имен файлов и читает файлы, а с несколькими аргументами показывает имена файлов, поэтому просто передайте список имен файлов напрямую.

Кроме того, не передавайте каталоги в grep. И используйте имена файлов с нулевым завершением -, чтобы избежать использования специальных символов в именах файлов.

find. -type f -print0 | xargs -0 grep 'abc'
2
19.03.2021, 02:31

При таком запуске xargs catимена файлов теряются, и нет хорошего способа передать их через конвейер одновременно с потоком данных.

Но grep -lперечисляет имена файлов с соответствующими строками, поэтому вы можете использовать это:

find. -type f | xargs grep -l hello

Или просто grep -rрекурсивно копаться в каталоге, а также решать проблемы xargsс именами файлов, содержащими пробелы или кавычки:

grep -lre abc.

Если вам нужны совпадающие строки, а не только имена файлов, удалите -l, чтобы получить обычное grepповедение. С -rон также должен печатать совпадающие имена файлов, даже если мы указываем только один путь в командной строке.

8
19.03.2021, 02:31

xargsявляется лишним. Когда вы делаете xargs cat | grep, grepвидит только безымянный входной поток, который содержит объединенное содержимое всех файлов. Вместо этого:

find. -type f -exec grep -H 'abc' {} +

Это вызовет grepдля каждого файла (и сведет к минимуму количество экземпляров grepпутем вызова grepс несколькими файлами в качестве параметров ).

7
19.03.2021, 02:31
find./ -type f -exec grep -H abc {} \;

или

grep -R 'abc'./
3
19.03.2021, 02:31

Теги

Похожие вопросы