2012-06-07 27 views
0

我要投入大量的濾波在bash腳本,讓我的過濾命令短一點:如何正確處理Bash腳本中的IO?

#before: 
$ cat unreadable.log | grep "bla" |[...]| sed "s/blubb//" >>readable.log 
#after: 
$ cat unreadable.log | the_script_I_m_writing.sh >>readable.log 

但是,如何正確處理IO中的bash腳本,該after線可如圖所示執行? 正如你可以在bash腳本里面看到的那樣,將會有很多簡單的命令組合在一起。所有這些管道應該從stdin開始,並將最終結果發送到stdout

回答

3

cat如果未給出文件參數,則從標準輸入讀取。

#!/usr/bin/env bash 
cat | grep "bla" | sed 's/blubb//' 

或者,只寫一個接受的源文件名作爲參數的腳本。

#!/usr/bin/env bash 
cat "$1" | grep "bla" | sed 's/blubb//' 

使用:./script unreadable.log


在這個簡單的例子,你也可以跳過cat,並剛剛與grep開始。

#!/usr/bin/env bash 
grep "bla" | sed 's/blubb//' 

用途:

# unnecessary cat if it's just a file 
cat file | ./script.sh 

# get stdin from file 
./script.sh < file 
+1

您也可以跳過'grep',因爲'sed'可以做到這一點:'sed的 '/ BLA/S/blubb //''(除了OP顯示'grep'和'sed'之間可能存在一些命令 –

+0

@ DennisWilliamson實際上,在這兩種情況下替換隻應用於匹配行,而不匹配的行不會被sed刪除 –

+1

很簡單:'sed -n'/ bla/s/blubb // p'' –