我一直在尝试找到一种方法来将文件路径添加到文件中的每行打印文本中。因此,例如,当我显示文件时,如果我有一个邮件日志文件(让我们称之为/var/log/mail.log),我会在stdout中获取行,例如:
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]
现在我需要做的是将文件打印到stdout并显示:
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命令来执行此操作,因为这需要在数百个不同的服务器上运行,而无需安装附加程序。
答案 0 :(得分:2)
通常,要将任何字符串附加到每行的末尾,您可以使用sed
。
sed 's/$/ INSERT_STRING_HERE/' InputFileName
对于您的特定问题,如果您尝试遍历一堆文件,则该文件名应作为变量提供。
答案 1 :(得分:1)
以下awk脚本会将文件名添加到每一行:
awk '{ print $0, ARGV[1] }' file
答案 2 :(得分:0)
如果您不介意在开头而不是结尾添加此信息:grep
' -H
开关可以在每个匹配的行前加上在命令行上给出的相应文件名以及结肠。在这种情况下,我们要求grep
匹配任何一行:
grep -H "" /var/log/mail.log
对于15.000对数行,我的测试中的性能大约为100毫秒。
答案 3 :(得分:0)
还有一个:
awk '{print $0" "FILENAME;}' /path/to/some/file