2012-06-07 28 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'' –