如何解决tr和cut不可用?

时间:2014-11-03 15:46:51

标签: bash cut tr

我没有trcut可供使用。这个(提取)在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解决方案非常有效!

2 个答案:

答案 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内置替换外部实用程序tailtrcut等的方法。我们假设(至少)一个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,则可以用更好的方式编写这些命令。