grep为子字符串

时间:2017-03-11 23:22:17

标签: linux unix grep

我有一个文件在文件的随机位置有以下用户名:

albert@ghhdh
albert@jdfjgjjg
john@jfkfeie
mike@fjfkjf
bill@fjfj
bill@fkfkfk

用户名是@符号左侧的名称。 我想使用unix命令grep文件中的用户名,然后计算唯一的用户名。

因此,使用上面的示例,输出应该说明有4个唯一用户(我只需要计数作为输出,没有单词)

有人可以帮我确定正确的计数吗?

3 个答案:

答案 0 :(得分:1)

您可以在@之前提取单词,对它们进行排序并计算它们:

cat test.txt | cut -d '@' -f 1 | sort | uniq -c

使用test.txt

albert@ghhdh
john@jfkfeie
bill@fjfj
mike@fjfkjf
bill@fkfkfk
albert@jdfjgjjg

输出:

  2 albert
  2 bill
  1 john
  1 mike

请注意,重复的用户名不必在输入列表中分组。

如果您只对uniq用户的数量感兴趣:

cat test.txt | cut -d '@' -f 1 | sort -u | wc -l
# => 4

或更短:

cut -d '@' -f 1 test.txt | sort -u | wc -l

答案 1 :(得分:1)

这是一个解决方案,即在一行中的任何地方找到用户名(不仅仅是在开头),即使一行中有多个用户名,并找到它们的唯一计数:

grep -oE '\b[[:alpha:]_][[:alnum:]_.]*@' file | cut -f1 -d@ | sort -u | wc -l
  • -o仅提取匹配的部分
  • -E处理扩展正则表达式
  • \b[[:alpha:]_][[:alnum:]]*@匹配用户名(字边界\b后面的字符串,以字母或下划线开头,后跟零个或多个字母数字和其他允许的字符,以@结尾
  • cut -f1 -d@提取用户名部分,然后对其进行排序并计入唯一名称

答案 2 :(得分:0)

如果允许使用awk,则使用一个awk命令更快:

awk -F"@" '!seen[$1]++{c++}END{print "Unique users =" c}' 

小解释:
使用@作为分隔符(-F),为awk查找字段1 = $ 1 对于每次不再看到的字段1,我们增加一个计数器c 同时我们增加了特定的字段1,所以如果再次找到测试"没有看到"无效。
最后,我们只打印出独特"看到"的柜台。

此外,此解决方案不需要预先排序。即使文件未排序,也会找到重复项。