我没有tr
和cut
可供使用。这个(提取)在Linux服务器上与它们一起使用:
disk_avail=$(df -k /var/tmp | tail -1 | tr -s ' ' | cut -d' ' -f4)
pids=$(cat /var/tmp/$0.pid | tr -s ' ' | cut -d ' ' -f 2)
while [ $count -le 4 ]
..但是当我尝试在设备上实现它时,它说:
tr: not found
cut: not found
tr: not found
cut: not found
[: -lt: unexpected operator
有人可以帮我解决这个问题吗? 我刚检查过,sed和awk可用 该设备是运行JunOS的Juniper路由器 按要求输出:
%ls / bin / cut
ls:/ bin / cut:没有这样的文件或目录
%ls / usr / bin / cut
ls:/ usr / bin / cut:没有这样的文件或目录
%
感谢下面的awk建议,我会尽快尝试一下。
awk解决方案非常有效!
答案 0 :(得分:2)
awk
通常是可用的,所以假设你在机器中有它,这种方法可以帮助你解决问题:
df -k /var/tmp | tail -1 | tr -s ' ' | cut -d' ' -f4
这意味着您希望从df -k
的最后一行获得第4个字段。
这是等效的:
disk_avail=$(df -k /var/tmp | awk 'END {print $4}')
我们正在利用awk
在处理END
块时能够访问最后一行。这样,您可以打印最后的第4个字段。此外,无需合并tr -s' '
和cut
,因为awk
会将多个空格合并为一个。
关于这一个:
pids=$(cat /var/tmp/$0.pid | tr -s ' ' | cut -d ' ' -f 2)
这会从/var/tmp/$0.pid
获取第二个字段。同样,你可以使用这个awk:
pids=$(awk '{print $2}' /var/tmp/$0.pid)
关于while [ $count -le 4 ]
的问题,请考虑Keith Thompson comments:
[: -lt: unexpected operator
可能是因为$count
因为早期的错误而空了。引用这个论点会避免 那:while [ "$count" -le 4 ]
答案 1 :(得分:2)
我希望你至少有一个合适的外壳。
以下是您可以(有利地)使用shell内置替换外部实用程序tail
,tr
,cut
等的方法。我们假设(至少)一个POSIX shell。
第一行:
disk_avail=$(df -k /var/tmp | { read -r _; read -r _ _ _ d _; echo "$d"; })
这一行假设df -k /var/tmp
输出两行(一行用于标题,一行用于内容),而你的tail -1
实际上想要第二行。这很可能适用于您的情况。
第二行:
pids=$(while read -r _ p _; do echo "$p"; done < /var/tmp/$0.pid)
对于最后一行,在您的OP中注释为@Keith Thompson,这可能是由于缺少引号。使用:
while [ "$count" -le 4 ];
至少在这种情况下你会得到一个不同的错误 - 可能像[: Illegal number:
。
你标记了你的问题Bash。如果确实安装了Bash,则可以用更好的方式编写这些命令。