如何为特定字段设置grep而不是整行

时间:2015-09-03 13:24:47

标签: linux awk grep

我想知道如何在文件的每一行上为特定字段设置grep。我不想为一个模式grep整行。

e.g。

33 >> sender1 >> recipient2 >> subject vvv
33 >> sender2 >> recipient2 >> subject aaa
22 >> sender1 >> recipient3 >> subject ccc
22 >> sender1 >> recipient3 >> subject xxx
  • 1)我怎样才能在收件人字段中进行grep?
  • 2)我怎样才能在发件人和收件人字段中进行grep?

谢谢!

4 个答案:

答案 0 :(得分:5)

仅在收件人身上

“grep”:

awk -F'>>' '$3~/yourPattern/||$2~/yourPattern/' file

收件人和发件人:

{{1}}

答案 1 :(得分:4)

使用awk代替grep,用于搜索发件人提交的

$ awk '$3 ~ /sender/ { print }' filename.txt

用于搜索发件人和收件人

$ awk '$3 ~ /sender2/ || $5 ~ /recipient2/ { print }' filename.txt

字段由空格分隔。您可以按awk -F">>" '$3 ~ /sender/ { print }' filename.txt添加自定义分隔符。您可以通过替换AND,OR|| for OR逻辑来使用&& for AND中的条件。

答案 2 :(得分:0)

已发布内容的变体:

awk -F' *>> *' '$3=="recipient2"'

这会将Field Separator设置为更有用的东西,因为它包含空格。现在recipient20将无法匹配。您可以通过包含^和“$ , or> and \ _<``等锚点来阻止这些错误匹配,但测试相等性通常会更容易。

以下是对第二个字段的测试,在第一个变体中,如果两者中的任何一个匹配,则打印该行,在第二个字段中,当满足两个条件时:

awk -F' *>> *' '$3=="recipient2" || $2=="sender1"'
awk -F' *>> *' '$3=="recipient2" && $2=="sender1"'

答案 3 :(得分:0)

awk很好,但对于非awk用户来说,以下内容可能更直观。

收件人字段:

cut -d'>' -f5 filename | grep searchString

发件人和收件人字段:

cut -d'>' -f3,5 filename | grep searchString

但你确实失去了剩下的部分。