【问题标题】:Bash - Disable regex in awk statementBash - 在 awk 语句中禁用正则表达式
【发布时间】:2016-05-31 04:09:27
【问题描述】:

我有一个像这样的文本文件:

tets v1.0
psutil==4.1.0
tclclean==2.4.3

test v2.0
psutil==3.1.1
pyYAML==3.11

not_test
psutil==4.1.0
tclclean==2.8.0

我正在使用 awk 和用户的输入来查找特定块第一行下的文本。我使用的命令是(其中 user_in 是用户的输入)...

awk -v ORS='\n\n' -v RS= -v FS='\n' "\$1 ~ \"^$user_in$\"" myfile.txt

问题在于,如果用户输入“.*”,awk 语句会将其视为正则表达式并给我所有三个块,但我不希望输出任何内容,因为它不匹配字面上的任何第一行。

我想说的是,有没有办法在 awk 中禁用正则表达式并以字面方式获取每个字符(与 fgrep 相同)?

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。

    现在让我们清理你的脚本:

    awk -v ORS='\n\n' -v RS= -v FS='\n' "\$1 ~ \"^$user_in$\"" myfile.txt
    

    不要将任何工具的任何脚本用双引号括起来,始终使用单引号,这样您就不会陷入反斜杠转义的地狱。于是上面就变成了:

    awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" '$1 ~ "^"user_in"$"' myfile.txt
    

    如果你想测试一个字符串,那么只需测试一个字符串,而不是一个正则表达式,例如查找 $1 STARTS WITH 您的目标字符串的记录:

    awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" 'index($1,user_in)==1' myfile.txt
    

    CONTAINS你的目标字符串:

    awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" 'index($1,user_in)>=1' myfile.txt
    

    ENDS WITH您的目标字符串:

    awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" 'index($1,user_in)==(length($1)-length(user_in))' myfile.txt
    

    或者如果您想找到 $1 IS 目标字符串而不是仅仅以它开头(正如您的脚本所尝试的那样)的情况,它甚至更简单:

    awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" '$1 == user_in' myfile.txt
    

    【讨论】:

    • 我实际上是在寻找 $1 是字符串的情况,仅此而已。我虽然可以反斜杠 ^$ 所以它看起来像 $1 == "\^$user_in\$" 但它似乎没有用。但是您的代码运行良好!
    • 任何时候你发现自己试图禁用任何工具中的所有正则表达式元字符,你的方法都是错误的,因为你真的只想做一个字符串,而不是正则表达式,比较。很高兴它对你有用。
    【解决方案2】:

    ~ 是正则表达式运算符。 如果您不想使用正则表达式,请使用==,并且不要将您的输入包装在^...$ 中,如下所示:

    awk -v ORS='\n\n' -v RS= -v FS='\n' "\$1 == \"$user_in\"" myfile.txt
    

    这仍然不够安全,因为例如如果user_in 包含",则该命令将不起作用。最好将它作为 awk 的 user_in 变量传递:

    awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" '$1 == user_in'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-26
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 2013-09-13
      • 2021-02-19
      • 1970-01-01
      相关资源
      最近更新 更多