Я не вижу в вашем примере ничего, что бы вы делали для установки заголовка 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
Попробуйте 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}' {} +
Grep принимает несколько имен файлов и читает файлы, а с несколькими аргументами показывает имена файлов, поэтому просто передайте список имен файлов напрямую.
Кроме того, не передавайте каталоги в grep. И используйте имена файлов с нулевым завершением -, чтобы избежать использования специальных символов в именах файлов.
find. -type f -print0 | xargs -0 grep 'abc'
При таком запуске xargs cat
имена файлов теряются, и нет хорошего способа передать их через конвейер одновременно с потоком данных.
Но grep -l
перечисляет имена файлов с соответствующими строками, поэтому вы можете использовать это:
find. -type f | xargs grep -l hello
Или просто grep -r
рекурсивно копаться в каталоге, а также решать проблемы xargs
с именами файлов, содержащими пробелы или кавычки:
grep -lre abc.
Если вам нужны совпадающие строки, а не только имена файлов, удалите -l
, чтобы получить обычное grep
поведение. С -r
он также должен печатать совпадающие имена файлов, даже если мы указываем только один путь в командной строке.
xargs
является лишним. Когда вы делаете xargs cat | grep
, grep
видит только безымянный входной поток, который содержит объединенное содержимое всех файлов. Вместо этого:
find. -type f -exec grep -H 'abc' {} +
Это вызовет grep
для каждого файла (и сведет к минимуму количество экземпляров grep
путем вызова grep
с несколькими файлами в качестве параметров ).