我一直在试图find一种方法来将文件path添加到文件的每一行打印文本。 所以,例如,如果我有一个邮件日志文件(让我们称之为/var/log/mail.log),当我显示文件,我得到的行在标准输出,如:
Jun 27 03:28:39 host courier-pop3d: LOGIN, user=bob@domain.net, ip=[::ffff:1.1.1.1], port=[2796] Jun 27 03:28:46 host courier-imaps: Connection, ip=[::ffff:1.1.1.1] Jun 27 03:28:46 host courier-imaps: LOGIN FAILED, method=CRAM-MD5, ip=[::ffff:1.1.1.1] Jun 27 03:28:52 host courier-imaps: LOGIN FAILED, user=alice@domain.com, ip=[::ffff:1.1.1.1] Jun 27 03:28:52 host courier-imaps: authentication error: Input/output error Jun 27 03:28:55 host courier-pop3d: Connection, ip=[::ffff:1.1.1.1] Jun 27 03:28:55 host courier-pop3d: LOGOUT, ip=[::ffff:1.1.1.1]
现在我需要的是将文件打印到标准输出并显示:
Jun 27 03:28:39 host courier-pop3d: LOGIN, user=bob@domain.net, ip=[::ffff:1.1.1.1], port=[2796] /var/log/mail.log Jun 27 03:28:46 host courier-imaps: Connection, ip=[::ffff:1.1.1.1] /var/log/mail.log Jun 27 03:28:46 host courier-imaps: LOGIN FAILED, method=CRAM-MD5, ip=[::ffff:1.1.1.1] /var/log/mail.log Jun 27 03:28:52 host courier-imaps: LOGIN FAILED, user=alice@domain.com, ip=[::ffff:1.1.1.1] /var/log/mail.log Jun 27 03:28:52 host courier-imaps: authentication error: Input/output error /var/log/mail.log Jun 27 03:28:55 host courier-pop3d: Connection, ip=[::ffff:1.1.1.1] /var/log/mail.log Jun 27 03:28:55 host courier-pop3d: LOGOUT, ip=[::ffff:1.1.1.1] /var/log/mail.log
我正在寻找一个标准的BASH命令来执行此操作,因为这需要在数百个不同的服务器上运行,而无需安装额外的程序。
如果您不介意在开始而不是结尾添加这些信息: grep
的-H
开关可以使每个匹配的行都与命令行上给出的各自的文件名以及冒号相同。 在这种情况下,我们要求grep
匹配任何一行:
grep -H "" /var/log/mail.log
在我的测试中,性能在15000条对数线上约为100毫秒。
一般来说,要将任何字符串追加到每一行的末尾,可以使用sed
。
sed 's/$/ INSERT_STRING_HERE/' InputFileName
对于你的具体问题,如果你试图通过一堆文件循环,那么这个文件名应该是一个变量。
下面的awk脚本会将文件名添加到每一行:
awk '{ print $0, ARGV[1] }' file
还有一个:
awk '{print $0" "FILENAME;}' /path/to/some/file