我想在Bash脚本中加入大量过滤,以使我的过滤命令更短一点:
#before:
$ cat unreadable.log | grep "bla" |[...]| sed "s/blubb//" >>readable.log
#after:
$ cat unreadable.log | the_script_I_m_writing.sh >>readable.log
但是如何正确处理bash脚本中的IO,after
行可以如图所示执行?
正如您在bash脚本中看到的那样,会有很多简单的命令通过管道连接在一起。所有这些管道应该以{{1}}开头,并将最终结果发送到stdin
。
答案 0 :(得分: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