【问题标题】:Greping asterisk through bash通过 bash 搜索星号
【发布时间】:2016-04-18 10:41:38
【问题描述】:

我正在验证管道分隔文件中的几列。我的第二列默认使用“*”。

例如要验证的文件数据:

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 反转匹配。

我如何 grep **

【问题讨论】:

  • 另外,请注意unmatch_count=cat &lt;file&gt; | ... 不起作用。如果要将命令的输出存储在变量中,例如var=$(command)
  • 管道 catcutcutawkawkgrep 简直太疯狂了。 awk -F '\t' -v x="$Value_to_match" '$2 != x { a[$2]++ } END { for (s in a) printf("%8d%s\n", a[s], s }' filename(猜测一下你真正想要什么)。
  • 大学里​​没有人教shell脚本了吗?好悲伤...

标签: bash unix grep cut cat


【解决方案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

【讨论】:

  • 我只想搜索我的“Value_to_match”变量中提到的单颗星。但是,如果我得到任何错误数据,因为在这种情况下我得到了 '' 它也可以是 '' 或其他一些值,我的 'Value_to_match' 变量应该能够捕获它.该代码对于其他值(如字母数字值或单个数字特殊字符)运行良好,但代码无法验证“*”场景。
  • @Ishan 你的问题不清楚。编辑它,描述你想要什么以及你需要什么输出。那我再看看。
  • 我只需要找出错误数据的发生。在这种情况下,它应该给我输出 1 但它给我 0
  • @Ishan 这正是我的回答。
  • 您似乎已经硬编码了 2asterisk。 2个星号作为错误出现在文件中,我不确定文件中将流动什么样的错误数据,我只知道应该流动的正确数据,即单个星号,如果除此之外还有其他东西应该改变我的变量中的计数。我尝试了将条件应用为 /**/ 的代码,我得到计数​​为 1 但是如果我把它作为 /*/ 它给了我 3
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多