Grep字符串,如果它有多个匹配

时间:2016-02-20 12:38:27

标签: bash awk sed grep

很难提出问题,我会举例说明。 Txt文件有这些行

city:state:address
city:state
city:

我需要提取字符串

a) only one occurrences of : 
b) only one occurrences of : and has value after :
c) two occurrences of :

并将这些字符串放到不同的文件中,因此一个文件将包含所有字符串 city:state:addresscity:state第三个city:

注意:文件有很多这样的字符串。在一个命令中创建三个文件不是强制性的。这将是一个命令,我可以定义应该包含多少:字符串。

2 个答案:

答案 0 :(得分:3)

使用这些grep调用并将输出传递到不同的文件中:

  1. grep -E "^[^:]+:\s*$" file.txt
  2. grep -E "^[^:]+:[^:]+$" file.txt
  3. grep -E "^[^:]+:[^:]+:.*$" file.txt
  4. 它使用正则表达式:查找不是[^:]+的内容。它在开头和结尾使用^$来匹配整个输入行。

答案 1 :(得分:3)

这是awk的工作,而不是grep。您所需要的只是:

awk -F':' '
    NF==3 { print > "file_c"; next }
    { print > ($2=="" ? "file_a" : "file_b") }
' file

并且会在输入文件的一次传递中创建所需的所有文件。

如果您有更多字段和更多规则,只需将它们全部写下来,以便它们互相排斥,例如你可以实现上述:

    NF==3           { print > "file_c" }
    NF==2 && $2=="" { print > "file_a" }
    NF==2 && $2!="" { print > "file_b" }