2013-06-21 52 views
0

我正在嘗試做一些非常簡單的事情,但按照我想要的方式解決它也會幫助我完成許多其他命令。如何在UNIX中逐行輸入輸入,在每一行執行命令並立即返回輸出?

我想在UNIX中逐行讀取文件,並在它們上執行命令,在這種情況下字符數。對於整個文件,我只會使用:

wc -m 

但是,我希望每行輸入。通過UNIX命令進行操作,一行一行地流式傳輸文件最簡單,最簡單的方法是什麼?我問,因爲在這種情況下,我想每行都使用wc -m,但未來的應用程序將使用完全不同的命令。

另外,我想避免perl和awk!我已經知道如何用這些工具做到這一點,但我正在尋找其他方法。

謝謝!

編輯:謝謝你的鏈接到另一個問題,但看到他們的4個答案後,我沒有看到我的確切困惑的解決方案。

鑑於以下輸入:

cat test.txt 
    This is the first line. 
    This is the second, longer line. 
    This is short. 
    My Final line that is much longer than the first couple of lines. 

我想通過一些代碼,將一行閱讀線和每行執行命令,將立即返回結果插上電源。

一些代碼,做wc -m每行並返回輸出:

23 
32 
14 
65 

或者一些代碼,做cut -d " " -f 1每行並返回輸出:

This 
This 
This 
My 

希望這使事情位清晰。再次感謝您的任何建議!

+0

的可能重複的[遍歷在bash文本文件的每一行(http://stackoverflow.com/questions/9353882/loop-over-每行文本文件在bash) – Vicky

+0

很難想象你期望的輸出。你能否包含一些簡單的樣本輸入和來自該輸入的預期輸出?祝你好運。 – shellter

+0

當然,會做。我正在編輯問題... – jake9115

回答

5

您可以使用echo "${#line}"來了解字符串的長度。用while read...讀取該文件將做休息:

$ cat file 
hello 
my name 
is fedor 
qui 


$ while read line; do echo "${#line}"; done < file 
5 
7 
8 
3 
0 

在一個更好的格式:

while read line 
do 
    echo "${#line}" 
done < file 
+0

嗨,謝謝你的回答。這與我所尋找的非常接近,但並不完全。我希望能夠在每行輸入中使用任何UNIX命令並立即返回結果。在這種情況下,你的代碼可以工作,因爲你使用'$ {#line}',但是如果我使用'wc -m',我會得到文件中的全部字符。我想要一些可以用於任何UNIX命令的東西! – jake9115

+0

提供的答案與您在問題中的具體情況相同。所以試着更具體一些......爲什麼'$ {#line}'不會有用? – fedorqui

+0

對不起,這是我的錯誤,因爲當我問我沒有足夠具體。我已經修改了我的問題。我對字符數並不是真正感興趣,而是一種用於任何UNIX命令的逐行流式傳輸機制。 – jake9115

1

您的行由行處理最好的辦法是while read循環,雖然成語使用保留行確切是:

while IFS= read -r line; do 
    # process "$line" 
done 

未能使用IFS=將失去領先的空白。未使用read -r意味着一些反斜槓序列將被bash解釋並且不會被逐字保存在變量中。

我覺得你可以奎德里重述:

我有一行文字。我如何像對待文件一樣對待它?

bash有2個功能,可以回答這個

  1. wc命令可從標準輸入讀取,使用here-string

    wc -m <<< "$line" 
    
  2. 對於需要文件的命令(我不能想到一個關閉我的頭頂),使用process substitution

    wc -m <(echo "$line") 
    

實施例:

$ line="foo bar baz" 
$ wc -m <<<"$line" 
12 
$ wc -m <(echo "$line") 
12 /dev/fd/63 

P.S. 我注意到char count包含隱含的尾隨換行符。要刪除,使用的printf不換行格式字符串

$ wc -m <(printf %s "$line") 
11 /dev/fd/63 
$ wc -m < <(printf %s "$line") 
11