如何在 bash 脚本中多次使用带“-”(破折号)的标准输入?
How to use more than once the stdin with a "-" (dash) in a bash script?
我正在编写一个 bash 脚本,其输入可以通过管道给出,为此我使用“-”,但它只能使用一次。我试图用 input=$(cat -)
将它保存在一个变量中,但我担心如果输入文件非常大,它可能会出现问题。我想知道使用“-”给我的输入的最佳方式。
脚本的想法是做这样的事情:
#!/bin/bash
a=(cat - | grep -c "whatever")
b=(cat - | grep -c "whatever")
c=$(echo "($a+$b)" | bc)
echo "$c"
默认情况下,cat
读取其标准输入。所以不需要“-”。
如果您需要从输入中“grep”两个正则表达式,您可以使用不带 cat
的 grep
,因为默认情况下它也会读取其标准输入。
如果目标是计算输入中两种不同模式的出现次数,那么您尝试做的等效操作可能类似于:
#!/bin/bash
grep -c -E '(whatever1|whatever2)'
正如评论中指出的那样,如果要求还考虑到行中模式的多次出现以及同一行中的两种模式,grep
的“-o”选项可以被使用:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line
使用这样的选项,grep
的输出与匹配模式的行数一样多。因此,增强代码计算那些带有 wc -l
的行并显示结果:
#!/bin/bash
grep -o -E '(whatever1|whatever2)' | wc -l
我正在编写一个 bash 脚本,其输入可以通过管道给出,为此我使用“-”,但它只能使用一次。我试图用 input=$(cat -)
将它保存在一个变量中,但我担心如果输入文件非常大,它可能会出现问题。我想知道使用“-”给我的输入的最佳方式。
脚本的想法是做这样的事情:
#!/bin/bash
a=(cat - | grep -c "whatever")
b=(cat - | grep -c "whatever")
c=$(echo "($a+$b)" | bc)
echo "$c"
默认情况下,cat
读取其标准输入。所以不需要“-”。
如果您需要从输入中“grep”两个正则表达式,您可以使用不带 cat
的 grep
,因为默认情况下它也会读取其标准输入。
如果目标是计算输入中两种不同模式的出现次数,那么您尝试做的等效操作可能类似于:
#!/bin/bash
grep -c -E '(whatever1|whatever2)'
正如评论中指出的那样,如果要求还考虑到行中模式的多次出现以及同一行中的两种模式,grep
的“-o”选项可以被使用:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line
使用这样的选项,grep
的输出与匹配模式的行数一样多。因此,增强代码计算那些带有 wc -l
的行并显示结果:
#!/bin/bash
grep -o -E '(whatever1|whatever2)' | wc -l