Linux脚本:在特定列中搜索关键字
我有一个包含多列数据的大文本文件。我试图编写一个脚本,从命令行接受列号和关键字,并在显示所有匹配项的整行之前搜索所有匹配项 我一直在尝试以下几点:Linux脚本:在特定列中搜索关键字,linux,search,awk,grep,Linux,Search,Awk,Grep,我有一个包含多列数据的大文本文件。我试图编写一个脚本,从命令行接受列号和关键字,并在显示所有匹配项的整行之前搜索所有匹配项 我一直在尝试以下几点: grep$fileName | awk'{if($'$columnNumber'=='$searchTerm')打印$0;}' 但这根本不起作用。我说的对吗?谢谢你的帮助 看起来很合理。尝试使用set-x查看传递给awk的确切内容。您还可以使用不同和/或更多awk功能,包括摆脱单独的grep: awk -v colnum=$columnNumber
grep$fileName | awk'{if($'$columnNumber'=='$searchTerm')打印$0;}'
但这根本不起作用。我说的对吗?谢谢你的帮助 看起来很合理。尝试使用
set-x
查看传递给awk
的确切内容。您还可以使用不同和/或更多awk功能,包括摆脱单独的grep:
awk -v colnum=$columnNumber -v require="$searchTerm"
"/$fileName/ { if (\$colnum == require) print }"
它通过设置awk变量(colnum
和require
,在本例中)然后使用文本字符串$colnum
获取所需字段,使用变量require
获取所需字符串来工作
请注意,在所有情况下(无论是否使用
grep
命令),$fileName
中的任何正则表达式元字符都将是meta-y,例如。,this.that
将匹配名为this.that
的文件,但也匹配名为thisXthat
的文件,-v选项可用于将shell变量传递给awk
命令
以下可能是您正在寻找的内容:
awk-vs=$SEARCH-vc=$COLUMN'$c==s{print$0}'file.txt
编辑:
我总是试图编写更优雅、更紧凑的代码。这就是丹尼斯的意思:
awk-vs=“$search”-vc=“$column”'$c==s{print$0}”file.txt
谢谢:-)很高兴我能help@user1136076:我建议引用那些shell变量。另外,列
(复数)是一个环境变量,与您的列
变量的名称非常相似。我建议您习惯性地使用小写或混合大小写变量名,以减少名称冲突的机会。请注意,“print$0”是多余的。你可以简单地做awk…'$c==s'file.txtI有一个函数,可以在一列中搜索一个字符串,我如何允许它,以便我可以为脚本提供多个列来搜索多个搜索字符串?awk-vs=$1-vc=$2'$c~s{print$0}'$3感谢您使用了-v
变量传递和嵌入式shell变量。我建议您只使用变量传递,对外部集合使用单引号,并避免分心的转义。使用-v
时,还应引用所有shell变量。匹配变量时,需要使用匹配运算符而不是斜杠。以下是您答案的修订版本:awk-v colnum=“$columnnume”-v require=“$searchTerm”-v file=“$fileName””$0~文件和$colnum==require'
。请注意,print
是隐含的。@DennisWilliamson:是的,我对列号的引用有点懒散,因为它首先必须是一个数字。请注意,“$0~var”在旧的awk中不起作用,例如SunOS:$awk'$0~“pattern”
给出:awk:第1行附近的语法错误。如果您不必处理古老的awk,请使用全变量版本。