したがって、データファイルがあり、2番目と3番目の垂直バー(|)の間に一致がある場合にのみ一致が発生するようにしたいと思います。
したがって、このデータサンプルから「ウィルソン」を検索すると、2行目が返されますが、「ウィルソン」という用語を含む3行目と5行目は返されません。
データサンプル:
| 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
2番目の列にのみ正規表現を適用することです。