【问题标题】:grep command not working as my expectationgrep 命令没有按我的预期工作
【发布时间】:2023-03-17 12:56:01
【问题描述】:

我有一个如下所述的文本文件,同时我将传递一个我想要相应输出的输入。

输入文件:test.txt

abc:abc_1
abcd:abcd_1
1_abcd:1_abcd_bkp
xyz:xyz_2

所以如果我在上面的 test.txt 文件中使用abc,我想要abc_1;如果我通过abcd,我需要abcd_1 作为输出。

我试过cat text.txt | grep abc | cut -d":" -f2,2,但我得到了输出

abc_1
abcd_1
1_abcd_bkp

当我只想要abc_1时。

【问题讨论】:

  • 你的意思是这样做(带下划线)? cat text.txt | grep abc_ | cut -d":" -f2,2

标签: linux shell grep sh cut


【解决方案1】:

使用 GNU grep:

grep -Po "^abc:\K.*" file

输出:

abc_1

\K 将匹配的文本保留在整个正则表达式匹配之外。

【讨论】:

    【解决方案2】:

    您想将regular expression-e 开关一起使用。 特别是,正则表达式允许您使用插入符号 (^) 来表示行首。

    由于您只关心位于行首的abc 并且后面是:,因此您需要:

    cat test.txt | grep -e "^abc:" | cut -d":" -f2,2
    

    输出:

    abc_1
    

    【讨论】:

      【解决方案3】:

      求救!

      awk -F: -v key="abc" '$1==key{print $2}'
      

      使用: 作为分隔符,在字段 1 上查找键以返回字段 2。

      或者,通过移动脚本中的键

      awk -F: '$1=="abc"{print $2}'
      

      【讨论】:

        【解决方案4】:

        你可以试试 exclude -v:

        猫文本.txt | grep abc | grep -vi abc[a-z]

        不确定这是否会完全奏效,尝试有这种想法的东西

        【讨论】:

          【解决方案5】:

          如果不指定要打印的第二个字段,则整行将是行,或者在其他情况下是行。

          awk -F: '/abc_/{print $2}' file
          abc_1 
          
          awk -F: 'NR==1,/abc/{print $2}' file
          abc_1
          

          【讨论】:

          • 能否添加解释,例如文档链接?
          • 我没有链接,但考虑到字段分隔符为冒号,abc 匹配第一行打印第二个字段。
          • 请将其添加到您的答案中。类似于@karakfa 的答案的描述会很好。谢谢。
          猜你喜欢
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 2014-10-15
          • 2015-11-17
          • 2010-10-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多