2014-11-03 54 views
2

我沒有trcut可供使用。這(提取物)與他們的作品在Linux服務器上:如何解決tr和剪切不可用?

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 /斌/切
LS:/斌/切:沒有這樣的文件或目錄
%LS的/ usr/bin中/切
LS:在/ usr/bin中/切:沒有這樣的文件或目錄

感謝您對下面的awk的建議,我會嘗試出來最快。

awk解決方案的工作表示感謝!

+0

你有'sed'或'awk'嗎? – Thomasleveil 2014-11-03 15:50:12

+2

什麼是設備?它運行的嵌入式Linux與Busybox之類的shell,還是運行真正的Bash? – 2014-11-03 15:50:15

+0

你有awk/sed嗎?只需鍵入它們並查看是否顯示幫助和選項?也粘貼ls/bin/cut的輸出; ls/usr/bin/cut確定這是PATH變量的問題 – SMA 2014-11-03 15:50:38

回答

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

+1是的,這應該工作 – anubhava 2014-11-03 15:52:36

2

我希望你至少有一個合適的殼。

下面是如何(有利地)用外殼內置代替外部實用程序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) 
    
  • 最後一行,爲@Keith Thompson在OP評論說,這可能是由於缺乏報價。用途:

    while [ "$count" -le 4 ]; 
    

    至少你會在這種情況下,可能像[: Illegal number:得到一個不同的錯誤。

您標記了您的問題Bash。如果確實已安裝Bash,則可以用更好的樣式編寫這些命令。