通过bash Greping星号

时间:2016-04-18 10:41:39

标签: bash unix grep cut cat

我正在验证管道分隔文件中的几列。我的第二栏默认为'*'。

E.g。要验证的文件数据:

abc|*    |123
def|**   |456
ghi|*    |789
由于数据错误,第二条记录有2颗星。

我把它当成了:

Value_to_match="*"
unmatch_count=cat <filename>| cut -d'|' -f2 | awk '{$1=$1};1' | grep -vw "$Value_to_match" | sort -n | uniq | wc -l
echo "unmatch_count"

这让我算作0,而我期望1(对于**),因为我使用-w与grep完全匹配,-v是反向匹配。

我怎样才能**

1 个答案:

答案 0 :(得分:1)

这里的问题是grep考虑**正则表达式。为防止这种情况,请使用-F来使用固定字符串:

grep -F '**' file

但是,你有一套不必要的大型管道操作,而awk只能处理它。

如果要在第二列中检查包含**的行,请说:

$ awk -F"|" '$2 ~ /\*\*/' file
def|**   |456

如果你想计算你有多少这样的行,请说:

$ awk -F"|" '$2 ~ /\*\*/ {sum++} END {print sum}' file
1

请注意awk的使用情况:

  • -F"|"将字段分隔符设置为|
  • $2 ~ /\*\*/说:嘿,在每一行检查第二个字段是否包含两个星号(记住我们用|切片行)。我们正在逃避*,因为它具有作为正则表达式的特殊含义。

如果要输出那些只有一个星号作为第二个字段的行,请说:

$ awk -F"|" '$2 ~ /^*\s*$/' file
abc|*    |123
ghi|*    |789

或者检查那些与此正则表达式不匹配的!~

$ awk -F"|" '$2 !~ /^*\s*$/' a
def|**   |456