因此,我有一个数据文件,并且我希望仅当第二和第三个垂直条(|)之间找到匹配项时才会发生匹配
因此,鉴于此数据样本,如果我搜索“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
仅针对第二列应用正则表达式。