内容が別のファイルと一致する場合、 `tail -f file`の出力行の前に追加


0

次のすべてをタイトルに詰め込もうとするのは大変だったので、これが私が本当に言っていることです。

私がやっているtail -F access.logリアルタイムでのApache2ログを監視します。各行の最初のものは、IPアドレスとそれに続くスペースです。また、各行がIPアドレス、コンマ、名前である不変のCSVファイルもあります。例えば:

10.1.2.33,John Smith
10.1.2.190,Jane Doe

成果物:以前と同じようにアクセスログを追跡したいのですが、CSVに現在のログファイルの行の先頭と同じIPアドレスを持つ行が含まれている場合は、行の先頭に人の名前を挿入します。

たとえば、次のような行:

10.1.2.33 - - [22/Aug/2013:13:41:24 +0000] "GET /index.php ...

代わりに次のようにレンダリングする必要があります。

John Smith 10.1.2.33 - - [22/Aug/2013:13:41:24 +0000] "GET /index.php ...

理想的には、いくつかの正規表現コマンドを一緒にパイプすることでこれを完全に行いたいと思います。これまでのところ、私の最大の問題は、grepがstdinのパターンを受け入れず、stdinのサブジェクトを予期することです(何かが欠落していない限り)。また、必要に応じてCSVをより適切な形式に変換するのに問題はありません。ありがとう。

回答:


1

これがPOSIXシェルソリューションです

tail -f access.log | while read -r line;do
    ip=${line%% *}
    name=$(grep -F "$ip" your_csv_file|cut -d, -f2)
    if [ -z "$name" ];then
        printf "%s\n" "$line"
    else
        printf "%s\n" "$name $line"
    fi
done

編集

ソリューションに加えられた2つの改善:

  • -rread読み取り行のエスケープシーケンスを評価しないように追加されたスイッチ
  • -FgrepIPを正規表現ではなく固定文字列として扱うように追加されたスイッチ。

1

私はこれを小さなPerlスクリプトで行います。

#!/usr/bin/env perl

## Open the first argument, the .csv file
 open($f,"<","$ARGV[0]"); 
## Collect the list of ips and names in the %ips hash
 while(<$f>){
    chomp;
    @a=split(/,/); 
    $ips{$a[0]}=$a[1]
 }
## Now open the second argument, the log file to be watched. The
## trick here is to open by piping through tail -F
 open($f,"-|", "tail -F $ARGV[1]");
 while(<$f>){
 ## Get the ip
  /^([\d\.]+)/; 
  $ip=$1; 
 ## Prepend the associated name from the .csv file if one is defined
  s/$ip/$ips{$ip} $ip/ if defined($ips{$ip});
 ## Print the line
  print;
}

それを$ PATHに保存し、ip2name.pl実行可能(chmod +x ip2name.pl)にして、次のように実行します。

ip2name.pl /home/foo/ips.csv /var/log/apache2/access.log

0

grepstdinからパターンを取得できますが、同時にstdinからテキストを取得することはできません。-fオプションを参照してください。シェルがプロセス置換をサポートしている場合、次のコマンドでシミュレートできます。

produce_patterns | grep -f- <( produce_input )

例えば:

( echo b; echo y ) | grep -f- <( for i in {a..z} ; do echo $i ; done )

出力:

b
y
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.