한동안 이 문제를 해결하려고 노력해 왔습니다. 이 웹사이트를 발견하고 미친 듯이 구글링을 했습니다. 누구든지 도와주실 수 있다면 감사하겠습니다.
헤더와 열이 없는 일부 로그 파일이 여기저기에 있습니다. 이는 src=4.2.2.2와 같은 항목이 파일의 어느 곳에나 있을 수 있음을 의미합니다. 파일의 모든 개체는 Something=xxx 형식을 갖습니다.
로그 예:
src=1.1.1.1 sport=12312 dport=80 메시지=해킹됨
dport=443 src=2.2.2.2 메시지=null 스포츠=32432
메시지=클린 dport=21 이동=43434 src=3.3.3.3
match() 함수를 사용했지만 여러 필드를 추출하려고 합니다.
gawk 'match($0, "src=([^ ]+)") { print substr($0, RSTART, RLENGTH) } ' 파일
나에게 다음을 제공합니다 :
소스=1.1.1.1
소스=2.2.2.2
소스=3.3.3.3
출력이 다음과 같이 정렬되도록 src, dport 및 message와 같은 여러 필드를 원합니다.
src=1.1.1.1 dport=80 message=해커 공격
src=2.2.2.2 dport=443 메시지=null
src=3.3.3.3 dport=21 메시지=청소
gawk나 다른 것을 사용하여 이 작업을 수행할 수 있습니까?
감사해요!
답변1
GNU awk 사용(참고: "키" 문자열의 어휘 정렬 순서에 따라 다름):
gawk '{split($0,a); asort(a); printf("%s\t%s\t%s\n", a[4], a[1], a[2])}' file
src=1.1.1.1 dport=80 message=hacked
src=2.2.2.2 dport=443 message=null
src=3.3.3.3 dport=21 message=clean
답변2
Awk
솔루션(프로젝트 위치에 관계없음):
awk 'function get_item(name){
match($0, name"=[^[:space:]]+");
return substr($0, RSTART, RLENGTH)
}
{ print get_item("src"), get_item("dport"), get_item("message") }' file
위의 방법을 사용하면 주요 필수 항목을 순서에 관계없이 출력할 수 있습니다.
산출:
src=1.1.1.1 dport=80 message=hacked
src=2.2.2.2 dport=443 message=null
src=3.3.3.3 dport=21 message=clean