sedを使用して、ログ出力のIPアドレスをホスト名に置き換えます。

sedを使用して、ログ出力のIPアドレスをホスト名に置き換えます。

dnsmasqログファイルのIPアドレスをホスト名に置き換えようとしています。ログファイルは「tail -f /var/log/dnsmasq.log」コマンドを使用してコンソールで「監視」されており、出力をsedにパイプして「Query」を含む行でのみIPアドレスを置き換えようとします。ホスト名テキスト。 IPアドレスは常にこの行の末尾にあります。

例示的な行は次のとおりです。

Apr  1 00:47:43 dnsmasq[1004]: query[A] gs-loc.apple.com from 10.1.1.188

私はコマンドが次の形式であると思います。

tail -f /var/log/dnsmasq.log | sed -e "s/'regex'/$(dig +short -x $1)/g"

「正規表現」は、「query」文字列を含む行を識別し、行の末尾からIPアドレスを抽出して(とにかく)変数に保存する必要があります。$1ここでは表記法を使用しました。置換式digに使用されました。

更新:IPアドレスが常に10.1.nn形式であることに言及できませんでした。

ベストアンサー1

残念ながら、sed 入力から取得した引数を渡しながら外部コマンドを実行することはできません。

以下はBashスクリプトソリューションです。

tail -f dnsmasq.log | { while IFS= read -r line ; do { [[ "${line}" =~ ": query[A]" ]] && printf '%s %s\n' "${line% *} " $(dig +short -x "${line##* }"); } || echo "${line}"; done ; }

分解の説明:(わかりやすくするためにコピーして貼り付けると機能しない可能性があります。)

tail -f dnsmasq.log | \
    { \
        while IFS= read -r line ; do \           # for each line read in from tail ...
            if [[ "${line}" =~ ": query[A]" ]] ; # if it has the literal string ': query[A]'
            then \
                printf '%s %s\n' "${line% *} " \ # print it (purged of last field, which is the IP address) ...
                $(dig +short -x "${line##* }") \ # along with dig's output
            else \                               # otherwise ...
                echo "${line}" \                 # just print it all as it is
            fi \
        done ; \
    }

おすすめ記事