2013-07-28 87 views
4

我需要在同一行中使用xargs(1)和bc(1)的幫助。我可以做多行,但我真的想在一行中找到解決方案。爲什麼bc和args在一行中不能一起工作?

這裏的問題是:下面的行將打印的file.txt

ls -l file.txt | cut -d" " -f5 

大小並且,以下行將打印1450(這顯然是1500至1550年)

echo '1500-50' | bc 

嘗試將這兩者加在一起,我這樣做:

ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50' | bc 

該pr會徽是,它不工作! :)

我知道xargs可能不是正確的命令,但它是唯一的命令,我可以找到誰可以讓我決定從管道獲取參數的位置。

這不是我第一次遇到這類問題。這將是很大的幫助..

感謝

回答

1

如果你這樣做

ls -l file.txt | cut -d" " -f5 | xargs -0 -I {} echo '{}-50' 

,你會看到這樣的輸出:

23 
-50 

這意味着,bc沒有看到一個完整的表達。

只需使用-n 1代替-0

ls -l file.txt | cut -d" " -f5 | xargs -n 1 -I {} echo '{}-50' 

,你會得到

23-50 

bc將樂意處理:

ls -l file.txt | cut -d" " -f5 | xargs -n 1 -I {} echo '{}-50' | bc 
-27 

所以你的基本問題是,-0預期不是線條但\0終止的字符串。因此,管道中先前命令的換行符會顯示bc的表達式。

+0

更好地瞭解我的錯誤,然後獲得替代:) – winter

1

這可能會爲你工作:

ls -l file.txt | cut -d" " -f5 | sed 's/.*/&-50/' | bc 

逸岸,你可以取出切成:

ls -l file.txt | sed -r 's/^(\S+\s+){4}(\S+).*/\2-50/' | bc 

或者用awk:

ls -l file.txt | awk '{print $5-50}' 
+0

謝謝你,不知道模式匹配的'&'替換。 – winter

1

ls命令解析輸出不是最好的主意。 (真)。

您可以使用許多其他的解決方案,如:

find . -name file.txt -printf "%s\n" 

stat -c %s file.txt 

wc -c <file.txt 

,並可以使用bash的算術,爲避免不必要的緩慢的過程叉,像:

find . -type f -print0 | while IFS= read -r -d '' name 
do 
     size=$(wc -c <$name) 
     s50=$(($size - 50)) 
     echo "the file=$name= size:$size minus 50 is: $s50" 
done 
1

這裏是另一種解決方案,其中只使用一個外部命令:如果你真的想將它們組合成一個線

file_size=$(stat -c "%s" file.txt) # Get the file size 
let file_size=file_size-50   # Subtract 50 

let file_size=$(stat -c "%s" file.txt)-50 

stat命令可以讓你的文件stat大小以字節計。上面的語法是針對Linux的(我是針對Ubuntu測試的)。在Mac上,語法略有不同:

let file_size=$(stat -f "%z" mini.csv)-50 
相關問題