如果第二列匹配某个值,则将其提取到文件中

时间:2019-04-23 06:34:50

标签: awk grep

我有一个文件,如果第二列与文件中的特定值匹配,我想在文件中打印整行

我的文件内容是

    xxxxx-test|test|machine1
    xxxxx-test|abcc|machine2
    xxxxx-test|bcd|machine3
    xxxxx-test|efgh ijhk|machine4
    xxxxx-test|efgh ijhk2|machine4

现在我要这一行xxxxx-test|efgh ijhk|machine4 grep在这里无法有效工作

cat file.txt | grep "efgh"
xxxxx-test|efgh ijhk|machine4

但是当我grep代表test时,它会显示所有行,因为我的第一列中包含test字符串。

cat file.txt | grep "test"
xxxxx-test|test|machine1
xxxxx-test|abcc|machine2
xxxxx-test|bcd|machine3
xxxxx-test|efgh ijhk|machine4

awk似乎也不起作用。

 cat file.txt | awk -F'|' '$2=="test" '
xxxxx-test|test|machine1

此行无济于事。

 cat file.txt | awk -F'|' '$2=="efgh"'
 cat file.txt | awk -F'|' '$2=="ijhk"'

当要匹配的字符串的值为test时,输出应为xxxxx-test|test|machine1

当要匹配的字符串的值为efgh时,输出应为xxxxx-test|efgh ijhk|machine4

当要匹配的字符串的值为ijhk时,输出应为xxxxx-test|efgh ijhk|machine4

有什么建议可以使用其他工具吗?

3 个答案:

答案 0 :(得分:2)

假设x=whatIwanttomatch,例如x=efgh,如果我们想坚持使用grep

grep "^[^|]*|[^|]*$x" bla

正则表达式匹配行首,然后吞噬所有非“ |”的内容,然后吞噬一个“ |”,然后吞噬下一个“ |”之前的内容。

使用awk

awk -v x="$x" -F'|' '$2 ~ x' bla

如果第二列与efgh*相匹配(以efgh开头),则我们进行打印。

无需cat进入管道,在两种情况下都只需将文件作为参数发送即可。最后,在纯Bash中:

while IFS=\| read -r col1 col2 col3; do 
    if [[ $col2 =~ *$x* ]]; then echo "$col1|$col2|$col3"; fi  ; 
done < bla

同样,我们希望第二列从我们的比赛开始。

附录

要确保第二行中的匹配项是“单词”,您需要在对应的匹配项周围加上标记“不是数字或字母”的内容-awk可以为"([^0-9a-zA-Z]|^)"x"([^0-9a-zA-Z]|$)",以允许在字符串^之前开始和在字符串$之后结束。对于grep,将在[^[:alnum:]]附近$x。对于Bash,对于这4种确切情况(“ |”或“”前后),您需要使用if

答案 1 :(得分:2)

您不需要使用正则表达式来匹配文字字符串。

$ awk -F'|' -v m='efgh' 'index($2,m)' file
xxxxx-test|efgh ijhk|machine4

答案 2 :(得分:0)

在gnu awk上尝试

awk -F\| '$2~/^(test|abcc|bcd)$|^efgh|ijhk$/ {print}' file.txt