列番号が異なる場合は、awkログファイルのホスト名とIPアドレス

列番号が異なる場合は、awkログファイルのホスト名とIPアドレス

これは私のサンプルファイルです。実際のデータにはより多くのデータが含まれています。

wolf@linux:~$ more log*
::::::::::::::
log1.csv
::::::::::::::
hostname,sn,type,ip,random
abc,a11,zzz,192.168.168.168,rrr
def,e16,yyy,192.168.168.169,fff
ghi,k16,yyy,192.168.168.170,ggg
::::::::::::::
log2.csv
::::::::::::::
hostname,sn,ip,random
abc,a11,192.168.168.168,rrr
def,e16,192.168.168.169,fff
ghi,k16,yyy,192.168.168.170,ggg
wolf@linux:~$ 

ホスト名などの一部のデータは、常に最初の列にあります。だから、それらを得るのは簡単です。awk -F, '{print $1}'

wolf@linux:~$ awk -F, '{print $1, $4}' log*
hostname ip
abc 192.168.168.168
def 192.168.168.169
ghi 192.168.168.170
hostname random
abc rrr
def fff
ghi 192.168.168.170
wolf@linux:~$ 

問題は、IPアドレスなどのデータがログファイルのデータによって異なる列にあることです。

grepを使用してホスト名とIP列のみを取得するにはどうすればよいですか?

wolf@linux:~$ awk -F, '/def/ {print $1, $4}' log*
def 192.168.168.169
def fff
wolf@linux:~$ 

wolf@linux:~$ awk -F, '/def/ {print $1, $3}' log*
def yyy
def 192.168.168.169
wolf@linux:~$ 

希望の出力

def 192.168.168.169
def 192.168.168.169

ベストアンサー1

データフィールドが各ファイルのヘッダー行の後にある場合は、次のことができます。

awk -F, 'FNR==1{ for(i=1; i<=NF; i++) if($i=="ip") break; next }
               { print $1, $i }' log*.csv

おすすめ記事