2011-08-19 26 views
19

我想使用來自'wc'的行作爲變量。例如:wc的結果作爲變量

echo 'foo bar' > file.txt 
echo 'blah blah blah' >> file.txt 
wc file.txt 

2 5 23 file.txt 

我想有類似關聯的值25$lines$words$characters23。我怎麼能在bash中做到這一點?

回答

7

還有其他的解決方案,但一個簡單的,我平時用的是放的wc的輸出臨時文件,然後從那裏讀取:

wc file.txt > xxx 
read lines words characters filename < xxx 
echo "lines=$lines words=$words characters=$characters filename=$filename" 
lines=2 words=5 characters=23 filename=file.txt 

優點此方法是您不需要創建幾個awk進程,每個變量一個。缺點是你需要一個臨時文件,你應該在之後刪除它。

注意:這不起作用:

wc file.txt | read lines words characters filename 

的問題是管道到read創建另一個進程,以及變量有更新,因此他們不是在調用shell訪問。

編輯:由arnaud576875,然後將溶液:

read lines words chars filename <<< $(wc x) 

作品沒有寫入文件(沒有管的問題)。它是特定的bash。

從bash的手冊:

Here Strings 

    A variant of here documents, the format is: 

      <<<word 

    The word is expanded and supplied to the command on its standard input. 

的關鍵是 「字展開」 位。

+0

比我好,但你不需要文件'xxx'或文件名:'wc

+0

@Adrian:請參閱我上面的評論:管道在另一個進程中創建變量,所以它們在調用shell中不可用。 – dangonfast

+5

''讀行字字符<<< $(wc x)'沒有寫入文件(並且沒有管道問題)的作品 – arnaud576875

3
lines=`wc file.txt | awk '{print $1}'` 
words=`wc file.txt | awk '{print $2}'` 
... 

還可以存儲wc結果第一的地方..然後分析它..如果你是挑剔的性能:)

0

您可以通過打開一個子殼輸出分配給一個變量:現在

$ x=$(wc some-file) 
$ echo $x 
1 6 60 some-file 

,以獲得不同的變量,最簡單的選擇是使用awk

$ x=$(wc some-file | awk '{print $1}') 
$ echo $x 
1 
30

在純bash下(無AWK)

a=($(wc file.txt)) 
lines=${a[0]} 
words=${a[1]} 
chars=${a[2]} 

這是通過使用bash的數組。 a=(1 2 3)創建一個包含元素1,2和3的數組。然後我們可以使用${a[indice]}語法訪問單獨的元素。

替代方案:(基於gonvaled溶液)

read lines words chars <<< $(wc x) 

或者在SH:

a=$(wc file.txt) 
lines=$(echo $a|cut -d' ' -f1) 
words=$(echo $a|cut -d' ' -f2) 
chars=$(echo $a|cut -d' ' -f3) 
+0

你能解釋爲什麼這個工作?特別是,第一行附加的括號是做什麼的?沒有它們,它不再起作用,所以它們顯得非常重要。 –

+0

在bash中,外部'(...)'創建一個數組,其後面的行索引。否則結果只是一個由三個數字組成的單個字符串 –

+0

在這種情況下,括號是$(_ command_)命令替換語法的一部分;它等同於\ command,但括號表示法簡化了嵌套。 _command_運行在一個子shell中,並且命令替換的文本被_command_的輸出替換,就好像您輸入了它一樣。 –

0
declare -a result 
result=($(wc < file.txt)) 
lines=${result[0]} 
words=${result[1]} 
characters=${result[2]} 
echo "Lines: $lines, Words: $words, Characters: $characters" 
4

我想補充另一種變體 -

set -- `wc file.txt` 
chars=$1 
words=$2 
lines=$3 

這顯然則會覆蓋$*和相關變量。與其他一些解決方案不同,它可以移植到其他Bourne shell。