【问题标题】:Print lines with JUST grep on a string and nothing more?仅在字符串上使用 grep 打印行,仅此而已?
【发布时间】:2014-08-22 01:01:53
【问题描述】:

使用 grep,我可以在文件中搜索某些内容并只获取包含字符串的行而不是包含其他文本的附加行吗?在下面的示例中(作为简化),我想打印带有密码 = 而不是密码 = [:alnum:] 的行。我不知道该怎么做。我有点需要 grep 因为我实际上捕获的不仅仅是这条线,但我从我的问题中排除了这个更大的命令。

带有数据的文件:

    password = Mike
    password = Jessica
    password = 
    password = Sofi
    password = Maya
    password = 

打印:

    password = 
    password = 

【问题讨论】:

    标签: bash


    【解决方案1】:

    您可以使用$(行尾)来确保没有额外的文字:

    grep '^password =\s*$' file
    

    【讨论】:

    • cat 的无用使用。 grep '^password =\s*$' file
    • 这似乎对我有用: egrep 'password =\s*$' -B 1 -A 2 ./test
    • ^ 胡萝卜似乎没有帮助
    • @MikeQ -B-A 将获得比赛前后的台词。您没有在问题中提到您想要这样的东西,此外,您的“预期输出”并未反映这样的要求。
    • 我认为你的意思是插入符号! :^)
    【解决方案2】:
    grep -F -x 'password =' file
    

    -F 是一个小调整,用于禁用正则表达式匹配并仅匹配文字字符串。 -x 指定整行必须匹配。

    【讨论】:

    • 这是正确答案。快速(因为没有正则表达式处理)、简短、POSIX compatible 启动。
    • 这取决于输入行在password = 之前或之后是否包含空格。如果是这样,这不起作用(原因很明显:)
    • 哦,对了,搜索表达式的间距必须与您要匹配的行的间距完全相同。如果它们可以变化,也许毕竟使用正则表达式。
    【解决方案3】:

    您可以使用 egrep 的正则表达式并使用 -v 反转匹配:

    grep -E -v 'password = \S+' file
    

    【讨论】:

    • S 需要小写
    • @Mike Q,使用 -v 选项反转匹配。
    【解决方案4】:

    将 grep 与扩展正则表达式一起使用(注意 egrep 已弃用):

    grep -E '=\s*$' file
    

    这样可以确保等号之后,行尾之前只有空格。

    或者,假设它们都是空格字符(例如,没有制表符):

    grep '= *$' file
    

    您也可以使用 POSIX 空白字符类:

    grep '=[[:space:]]*$' file
    

    如果您还需要确保“密码”一词也在行中:

    grep -E 'password\s*=\s*$' file
    

    【讨论】:

    • Tom,感谢您的回复,您知道为什么我不能将这些与 Awk 一起使用吗?例如这对我不起作用: awk -v RS= -v ORS='\n\n' '/password =\s*$/' ./test
    • "\s" 不被 awk 理解。根据您的 awk 版本和文件内容,您应该执行awk '/password = *$/' fileawk '/password =[[:space:]]*$/' file 之类的操作。
    • 谢谢,是的,这些工作。但是当我添加 RS= 和 ORS= 时,一切都崩溃了!
    • 记录分隔符应该是什么?如果您编辑您的问题以更清楚地说明您想要做什么,那么为您提供帮助会更容易。
    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多