Для примера ввода:
$ 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 |