如何在Linux中正确使用管道?

时间:2018-10-02 22:56:16

标签: linux shell

我有一个项目,目标是提取data.txt文件的电话号码,所以我做了一个程序。像这样:

   grep -E '^[ ]{0,9}\([0-9]{3}\) [0-9]{3}-[0-9]{4}[ ]{0,9}$' $1 | sed 's/^[ \t]*//' > all-result-phonenumber-filter.txt
count=$(wc -l all-result-phonenumber-filter.txt)

echo "The number of line is :$count" >> all-result-phonenumber-filter.txt

我的问题是,当我想使用此程序并在终端上执行时,必须对终端命令使用管道。我在终端上尝试了许多不同的命令,最后一个是:

cat data.txt | ./all-phone-number-filter.sh | cat all-result-phonenumber-filter.txt

但是该命令不起作用,我也不知道为什么。那么,我必须以上述格式使用正确的命令是什么?

我必须使用以下格式SDTIN |管道的STDOUT。

我给你data.txt文件:

(512) 258-6589

(205) 251-6584

(480) 589-9856

(303) 548-9874

(808) 547-3215

(270) 987-6547

(225) 258-9887

(314) 225-2543

(979) 547-6854

(276) 225-6985

les numeros suivants ne sont pas valables pour ce programme :

+512 325

+512 251 2545654654

+512 6546 6464646

+512546546646564646463313

(314) sgf225-2543

(314) 225-2543fsgaf

(314afd) 225-2543

FSd(314) 225-2543

我需要得到的结果是:

  (512) 258-6589
(205) 251-6584
(480) 589-9856
(303) 548-9874
(808) 547-3215
(270) 987-6547
(225) 258-9887
(314) 225-2543
(979) 547-6854
(276) 225-6985
The number of line is :10 all-result-phonenumber-filter.txt

2 个答案:

答案 0 :(得分:1)

尝试一下:

cat data.txt | ./all-phone-number-filter.sh > all-result-phonenumber-filter.txt

要查看结果,请执行下一个命令

cat all-result-phonenumber-filter.txt

答案 1 :(得分:1)

过滤器将:

  • 从stdin中读取
  • 写入标准输出

您的程序将:

  • 从stdin中读取
  • 写入硬编码的文件名

因此,您的程序不是过滤器,因此无法与您想要的程序类似地使用。

将程序变成过滤器的最简单/最糟糕的方法是改为写入一个临时文件,然后cat写入:

#!/bin/sh
# TODO: Rewrite to be a nicer filter that doesn't write to files
tmp=$(mktemp)
grep -E '^[ ]{0,9}\([0-9]{3}\) [0-9]{3}-[0-9]{4}[ ]{0,9}$' $1 | sed 's/^[ \t]*//' > "$tmp"
count=$(wc -l < "$tmp")

echo "The number of line is :$count" >> "$tmp"
cat "$tmp"
rm "$tmp"

现在您可以将其视为过滤器:

$ cat data.txt | ./all-phone-number-filter.sh | tail -n 3
(979) 547-6854
(276) 225-6985
The number of line is :10

$ cat data.txt | ./all-phone-number-filter.sh > myfile.txt
(no output)

$ nl myfile.txt | tail -n 5
 7  (225) 258-9887
 8  (314) 225-2543
 9  (979) 547-6854
10  (276) 225-6985
11  The number of line is :10