我们如何指定执行此命令的当前系统的主机名
ls -l | awk '{print $9}'
电流输出
fileabc.txt
fileABC.txt
filedata
fisample
预期产出
hostname fileabc.txt
fileABC.txt
filedata
fisample
如果我们在多个服务器上执行此操作并将日期存储在一个文件中,那么为了了解特定服务器的开始行和结束行,我们正在尝试执行此操作。
如果有更好的解决方案,请指教。
答案1
要获得更新问题的确切输出:
ls -1 | awk -vhostname="$(hostname)" \
'NR == 1 { printf("%-20s\t%s\n", hostname, $0) }
NR > 1 { printf("%-20s\t%s\n", "", $0) }'
ls -1
这会为主机名分配一个 20 个字符宽的列,并在第二列中添加 的输出。各列以制表符分隔,主机名仅出现在第一行。
似乎您在询问如何获取当前系统的主机名以及如何在文件名或文件内使用该主机名,以便能够判断数据来自哪个系统。
机器的主机名由hostname
命令给出。这通常给出完整的主机名,包括域名(如果已定义),同时hostname -s
给出第一个点之前的名称:
$ hostname
client.local
$ hostname -s
client
如果您有一些命令,并且您想创建一个文件名来存储其输出,那么您可以这样做:
somecommand >"$(hostname)_output.txt"
这将运行somecommand
(例如,您的ls
命令)并将其输出存储在一个文件中,该文件的名称包含其运行的系统的主机名。
如果您想将主机名插入文件的页眉或页脚中:
( echo "HEADER: The following comes from $(hostname)"
somecommand
echo "FOOTER: The above came from $(hostname)" ) >outputfile
或者,与awk
:
somecommand | awk -v hostname="$(hostname)" 'BEGIN { print "## From:", hostname }
{ print } END { print "## From:", hostname }'
其中somecommand
是您要存储其输出的命令。
如果您想用主机名标记每一行:
somecommand | awk -v hostname="$(hostname)" '{ print hostname, $0 }'
或者,其变体。
该-v
选项允许您在命令行上awk
设置变量。awk
您可能HOSTNAME
还定义了一个环境变量。在这种情况下,您可以使用它而不使用以下hostname
命令:
awk -v hostname="$HOSTNAME" ...
awk
或者,您可以使用 . 直接在代码内访问环境变量ENVIRON["HOSTNAME"]
。
答案2
您可以像这样插入“HOSTNAME”环境变量的内容:
ls -l | awk '{print ENVIRON["HOSTNAME"] ": " $9}'
如果这不起作用,请查看变量“HOST”是否包含您需要的内容:
ls -l | awk '{print ENVIRON["HOST"] ": " $9}'
如果两者都没有设置,请尝试以下操作:
ls -l | awk 'BEGIN { h="/bin/hostname"; h | getline host; close (h);} {print host ": " $9}'
这会调用该/bin/hostname
命令一次并将其输出放入host
变量中,然后在每行之前添加前缀。
编辑:您更改了问题,指出主机名只能打印一次。这是变体:
ls -1 | awk 'BEGIN { h="/bin/hostname"; h | getline host; close (hostname);} { if (NR < 2) {print host}; print "\t" $1}'