如何在第二个和第三个分隔符之间搜索

如何在第二个和第三个分隔符之间搜索

因此,我有一个数据文件,并且我希望仅当第二和第三个垂直条(|)之间找到匹配项时才会发生匹配

因此,鉴于此数据样本,如果我搜索“wilson”,我希望返回第二行,但不返回也包含术语“wilson”的第三行和第五行。

数据样本:

| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 11:40 | smith | resetpasswd | wilson |  Mozilla | 172.19.15.105 |
| 2015-08-21 - 11:41 | james | view | Main.ChangePassword |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | changepasswd | wilson |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | view | Main.Home |  | 172.19.15.102 |
| 2015-08-22 - 08:31 | doe | view | Main.Info |  | 172.19.6.103 |

答案1

对于您的示例输入:

$ cat /tmp/data
| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 11:40 | smith | resetpasswd | wilson |  Mozilla | 172.19.15.105 |
| 2015-08-21 - 11:41 | james | view | Main.ChangePassword |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | changepasswd | wilson |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | view | Main.Home |  | 172.19.15.102 |
| 2015-08-22 - 08:31 | doe | view | Main.Info |  | 172.19.6.103 |

您可以使用 awk:

$ awk '-F|' 'BEGIN { OFS = "|" }{ if ($3 ~ "wilson") { print }  }' /tmp/data
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |

$3 ~ "wilson"也可以$3 == " wilson "假设场地周围总是有空间。

要回答您的后续问题,您可以将其包装在 Bash 脚本中:

$ cat foo.sh
#/bin/bash
names="$(cat patlist.txt)"

for name in ${names}; do
    awk -F'|' '$3 == " '"${name}"' "' /tmp/data
done

$ cat patlist.txt
wilson
jones

$ bash foo.sh
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |

答案2

最简单的方法是将正则表达式与其他字段联系起来,例如:[0-9][0-9] | wilson,尽管这存在误报的风险。更复杂的是使用awk数据并将其拆分为列,然后awk仅针对第二列应用正则表达式。

相关内容