如何用脚本替换长输入处理管道?

时间:2011-03-15 07:10:11

标签: perl bash

我有一个很长的shell命令,如下所示:

cat file \
  | perl -pe 's/...//g' \
  | grep -v "hehe" \
  | $HOME/scripts/foo.pl \
  | sort | uniq -c

现在我想将整个管道放入脚本script.sh,以便命令变为:

cat file | ./script.sh

理想情况下,脚本应该也可以像这样调用:

./script.sh file

但是我该如何编写该脚本?这对我来说似乎并不简单。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

script.sh的内容:

cat $1 \
| perl -pe 's/...//g' \
| grep -v "hehe" \
| $HOME/scripts/foo.pl \
| sort | uniq -c

然后将其作为./script.sh file运行。

应该做的伎俩。

请注意引用第一个(也是唯一的)命令行参数的$1

答案 1 :(得分:0)

将一些简单的shell与一个小的Perl DWIMery结合起来,你可以让你的脚本做正确的事。

#!/bin/bash
perl -pe 's/...//g' "$@" \
  | grep -v "hehe" \
  | $HOME/scripts/foo.pl \
  | sort | uniq -c

您可以将其设为./script.sh file,它将显示为filegrep foo file | ./script.sh,并且会从STDIN读取。在bash和其他一些shell "$@"中扩展为引用的参数列表,如果没有参数则不会扩展。当perl没有任何文件参数时,它将默认从STDIN读取。