我有一个这样的文本文件:
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中禁用regex并以字面的方式(与fgrep相同的方式)获取每个字符?
最佳答案
阅读阿诺德·罗宾斯的《有效的awk编程》,第四版。
现在让我们清理一下你的脚本:
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
如果要测试字符串,那么只测试字符串,而不是regexp,例如查找$1以目标字符串开头的记录:
awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" 'index($1,user_in)==1' myfile.txt
或包含目标字符串:
awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" 'index($1,user_in)>=1' myfile.txt
或以目标字符串结尾:
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是目标字符串而不是仅仅以它开头的情况(正如您的脚本正在尝试的那样),则更简单:
awk -v ORS='\n\n' -v RS= -v FS='\n' -v user_in="$user_in" '$1 == user_in' myfile.txt
关于linux - Bash-在AWK语句中禁用正则表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37532788/