正则表达式搜索文本文件中的列

时间:2015-11-09 14:58:55

标签: regex linux awk grep

我无法获取将在指定列中搜索输入项的正则表达式。如果在该列中找到该术语,则需要输出整行。 这些是我的变量:

sreg = search word  #Example: Adam
file = text file   #Example: Contacts.txt
sfield = column number   #Example: 1

文本文件采用这种格式,空格为字段分隔符,有许多联系人条目:

    First Last Email Phone Category    
    Adam aster junfmr@ 8473847548 word
    Jeff Williams 43wadsfddf@ 940342221995 friend
    JOhn smart qwer@qwer 999999393 enemy
    yooun yeall adada 111223123 other
    zefir sentr jjdirutk@jd 8847394578 other

我尝试过没有成功:

grep "$sreg" "$file" | cut -d " " -f"$sfield"-"$sfield"
awk -F, '{ if ($sreg == $sfield) print $0 }' "$file"
awk -v s="$sreg" -v c="$sfield" '$c == s { print $0 }' "$file"

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

awk可能是最佳解决方案:

awk -v field="$field" -v name="$name" '$field==name' "$file"

检查字段编号$field是否具有值$name。如果是这样,awk会自动打印包含它的整行。

例如:

$ field=1
$ name="Adam"
$ file="your_file"
$ awk -v field="$field" -v name="$name" '$field==name' "$file"
Adam aster junfmr@ 8473847548 word

如您所见,我们使用-v var="$bash_var"提供参数,以便您可以在awk中使用它们。

此外,空格是字段分隔符,因此您不需要指定它,因为它是默认值。

答案 1 :(得分:1)

这对我有用:

awk -v f="$sfield" -v reg="$sreg" '{if ($f ~ reg) {print $0}}' "$file"

主要问题是你需要从$ sfield(ex,“1”)到$($ sfield)(ex,$ 1)的间接。

我尝试使用backtricks`,并且还使用$ {!sfield},但它们在awk中不起作用,因为awk不接受这个。最后我找到了将变量传递给awk的方法,转换为awk内部变量(使用-v)。

在awk中,我发现你甚至无法访问外部的变量。所以我也必须通过$ sreg。

更新:我认为使用“〜”代替“==”更好,因为原始要求说matchi == ng一个正则表达式。

例如, SREG =广告