各行から複数​​のパターンを検索し、新しいファイルに出力します。

各行から複数​​のパターンを検索し、新しいファイルに出力します。

サンプルファイルです。実際のログはこれよりはるかに大きいです。

user@linux:~$ cat log.txt 
[24/09/2018:22:41:49 GMT] "PROXY_SERVER_BA2" c-ip=x.x.x.x cs-bytes=1198 cs-categories="Technology/Internet" cs-host=shavar.services.mozilla.com cs-ip=y.y.y.y cs-method=CONNECT cs-uri-path=/ cs-uri-port=443 cs-uri-scheme=tcp cs-User-Agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" cs-username=johndoe dnslookup-time=0 duration=60 rs-status=0 s-action=TCP_TUNNELED

[24/09/2018:17:45:44 GMT] "PROXY_SERVER_AA2" c-ip=x.x.x.x cs-bytes=152450 cs-categories="Business/Economy" cs-host=cvshipping.ups.com cs-ip=z.z.z.z cs-method=CONNECT cs-uri-path=/ cs-uri-port=443 cs-uri-scheme=tcp cs-User-Agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" cs-username=johndoe dnslookup-time=0 duration=268 rs-status=0 s-action=TCP_TUNNELED

[24/09/2018:17:44:03 GMT] "PROXY_SERVER_AA2" c-ip=x.x.x.x cs-bytes=1795 cs-categories="Software Downloads" cs-host=blocklist.addons.mozilla.org cs-ip=z.z.z.z cs-method=CONNECT cs-uri-path=/ cs-uri-port=443 cs-uri-scheme=tcp cs-User-Agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" cs-username=johndoe dnslookup-time=0 duration=61 rs-status=0 s-action=TCP_TUNNELED

[24/09/2018:17:41:44 GMT] "PROXY_SERVER_AA2" c-ip=x.x.x.x cs-bytes=3882 cs-categories="Web Ads/Analytics" cs-host=cebwa.d2.sc.omtrdc.net cs-ip=z.z.z.z cs-method=CONNECT cs-uri-path=/ cs-uri-port=443 cs-uri-scheme=tcp cs-User-Agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" cs-username=johndoe dnslookup-time=0 duration=35 rs-status=0 s-action=TCP_TUNNELED

[20/09/2018:15:48:50 GMT] "PROXY_SERVER_AA2" c-ip=a.a.a.a cs-auth-group=Domain%20Users cs-bytes=227 cs-categories="Web Ads/Analytics;Suspicious" cs-host=data35.adlooxtracking.com cs-ip=b.b.b.b cs-method=CONNECT cs-uri-path=/ cs-uri-port=443 cs-uri-scheme=tcp cs-User-Agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0" cs-username=johndoe duration=0 rs-status=0 s-action=TCP_TUNNELED

[20/09/2018:15:48:35 GMT] "PROXY_SERVER_AA2" c-ip=a.a.a.a cs-auth-group=Domain%20Users cs-bytes=3201 cs-categories="Search Engines/Portals" cs-host=www.google.com cs-ip=b.b.b.b cs-method=CONNECT cs-uri-path=/ cs-uri-port=443 cs-uri-scheme=tcp cs-User-Agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0" cs-username=johndoe dnslookup-time=0 duration=117 rs-status=0 s-action=TCP_TUNNELED
user@linux:~$ 

私の目標は、各行のタイムスタンプ、カテゴリ、およびホスト名を取得して新しいファイルにリダイレクトすることです。

タイムスタンプ(中[ ]

user@linux:~$ sed -n 's/^.*\[//p' log.txt | cut -d ']' -f1
24/09/2018:22:41:49 GMT
24/09/2018:17:45:44 GMT
24/09/2018:17:44:03 GMT
24/09/2018:17:41:44 GMT
20/09/2018:15:48:50 GMT
20/09/2018:15:48:35 GMT
user@linux:~$ 

CPU名(後ろにcs-host=

user@linux:~$ sed -n 's/^.*cs-host=//p' log.txt | cut -d\  -f1
shavar.services.mozilla.com
cvshipping.ups.com
blocklist.addons.mozilla.org
cebwa.d2.sc.omtrdc.net
data35.adlooxtracking.com
www.google.com
user@linux:~$ 

カテゴリーcs-categories=""

user@linux:~$ sed -n 's/^.*cs-categories="//p' log.txt | cut -d '"' -f1
Technology/Internet
Business/Economy
Software Downloads
Web Ads/Analytics
Web Ads/Analytics;Suspicious
Search Engines/Portals
user@linux:~$ 

sedコマンドを1つずつ実行するのではなく、単一のコマンドを実行してこれらの出力を生成できますか?

期待される出力

24/09/2018:22:41:49 GMT    shavar.services.mozilla.com      Technology/Internet
24/09/2018:17:45:44 GMT    cvshipping.ups.com               Business/Economy
24/09/2018:17:44:03 GMT    blocklist.addons.mozilla.org     Software Downloads
24/09/2018:17:41:44 GMT    cebwa.d2.sc.omtrdc.net           Web Ads/Analytics
20/09/2018:15:48:50 GMT    data35.adlooxtracking.com        Web Ads/Analytics;Suspicious
20/09/2018:15:48:35 GMT    www.google.com                   Search Engines/Portals

また、これに対するより良い解決策がある場合は、お知らせください。

答え1

どのくらい行くのでしょうか?

sed -r '/^$/d; s/^[^[]*[[]([^]]*)[]].*cs-categories="([^"]*)".*cs-host=([^ ]*) .*/\1\t\3\t\2/' file
24/09/2018:22:41:49 GMT shavar.services.mozilla.com Technology/Internet
24/09/2018:17:45:44 GMT cvshipping.ups.com  Business/Economy
24/09/2018:17:44:03 GMT blocklist.addons.mozilla.org    Software Downloads
24/09/2018:17:41:44 GMT cebwa.d2.sc.omtrdc.net  Web Ads/Analytics
20/09/2018:15:48:50 GMT data35.adlooxtracking.com   Web Ads/Analytics;Suspicious
20/09/2018:15:48:35 GMT www.google.com  Search Engines/Portals

わかりますか?

sed -r '                        use extended regular expressions in the script
/^$/d                           delete empty lines

s/^[^[]*[[]([^]]*)[]].*         look for date time string between square brackets and prepare for 
                                the first "back reference"
cs-categories="([^"]*)".*       look for the string after cs-categories and prepare for second "b r"
cs-host=([^ ]*)                 look for the string after cs-host and prepare for third "b r"
.*/\1\t\3\t\2/                  create output line from back references separated by <TAB> chars.
'

答え2

プレビュー機能付きのPerlを使用してください。これにより、ホストがクラスの前か後であるかは重要ではありません。

perl -lne '
    m(
        ^\[ (.*?) \]                   # match the timestamp
        (?=.* cs-categories= "(.+?)")  # look ahead for the category
        (?=.* cs-host= (\S+) )         # look ahead for the host
    )x
    and print join ",", $1,$2,$3
' log.txt 

答え3

awkを使うのはどうですか?

awk '{t=""; h=""; c=""; for (i=1; i<=NF; i++) {if ($i ~ /^\[/) {t=$i} if ($i ~/^cs-host=/) {h=$i} if ($i ~ /^cs-categories=/) {c=$i}} if ((t != "") && (h != "") && (c != "")) printf("%s %s %s\n", t, h, c)}' _inputfile_

これはあなたができることのおおよその推定です。デフォルトでは、与えられた行の各空のフィールドを繰り返し、その行が特定の文字列で始まることを確認します。次に、そのフィールドの値をいくつかの変数に入れます。すべてのフィールドが処理された後、3つのフィールドがすべて空でない場合は印刷されます。次に、入力ファイルの次の行に移動します。

文字列のスペースを処理するために何もしません。既存のチェックのいずれかをさらにチェックして、文字列が二重引用符で終わっていることを確認できます。それ以外の場合は、次のフィールドを変数に追加します。

また、[、]、"などの項目を削除するために部分文字列を使用して何もしませんでした。練習用に残しておきます。

関連情報