이것은 내 샘플 파일입니다. 실제 데이터에는 더 많은 데이터가 포함되어 있습니다.
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