我有一个文件,如果第二列与文件中的特定值匹配,我想在文件中打印整行
我的文件内容是
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
。
有什么建议可以使用其他工具吗?
答案 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