열 번호가 다른 경우 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

답변2

나는 다음을 가져오는 것이 좋겠다:

awk -F, '{for(i=2;i<=NF;i++) if ( $i ~ /^192/ ) printf "%s %s\n",$1,$i ;}'

어디

  • IP가 192로 시작하는 것 같아요
  • 호스트 이름은 관련 필드 1 에 있습니다.
  • IP가 2개 이상인 경우 줄이 두 번 인쇄됩니다.

다음을 사용하여 IP를 추가로 제한 할 수 있습니다 if ( $i ~ /^[0-9\.]+$/ )(12개도 포착됩니다).

답변3

사용csvkit:

$ csvcut -c hostname,ip log1.csv
hostname,ip
abc,192.168.168.168
def,192.168.168.169
ghi,192.168.168.170
$ csvcut -c hostname,ip log2.csv
hostname,ip
abc,192.168.168.168
def,192.168.168.169
ghi,yyy

csvcut명령은 표준 cut명령과 다소 유사하게 작동하지만 헤더 정보를 사용하여 명명된 열을 추출할 수 있습니다.

이는 실제로 올바른 각 파일의 헤더에 의존합니다.

답변4

헤더가 있는 파일이 있는 경우 일반적으로 먼저 f[]아래 배열에 저장된 필드(열) 순서에 대한 헤더 태그(이름) 매핑을 만드는 것이 가장 좋습니다. 그런 다음 필드로 인덱스된 배열을 간단히 역참조할 수 있습니다. 필드 값 이름 가져오기 . 이렇게 하면 각 입력 파일의 열 순서에 관계없이 스크립트가 올바르게 작동합니다.

$ cat tst.awk
BEGIN { FS="," }
FNR==1 {
    delete f
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
    next
}
$(f["hostname"]) == h { print $(f["hostname"]), $(f["ip"]) }

$ awk -v h='def' -f tst.awk log*.csv
def 192.168.168.169
def 192.168.168.169

관련 정보