수천 개의 가상 머신에 수백 개의 로그가 분산되어 있고 로그를 빠르게 스캔하기 위해 몇 가지 스크립트를 작성하려고 하며 프레젠테이션의 대부분을 파악했으며 awk를 사용하여 이를 수행할 수 있는 쉬운 방법이 있는지 궁금합니다. 그런 식으로 printf 등을 사용하는 방법을 알고 있지만 특히 로그 파일에서 반복되는 값 범위를 인쇄하는 방법은 무엇입니까?
예:
awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.
나는 인쇄물을 올바르게 생성하고, 형식을 지정하고, 분리하는 등의 방법을 알고 있지만, 인쇄하고 싶은 필드 범위를 지정할 수 있다면 좋을 것이라고 생각했습니다.
제안된 유사한 질문을 사용하거나 문제를 직접 해결하는 방법을 알아내면 내 질문을 업데이트하겠습니다.
감사해요!
편집: $1 $2 $3 을 수동으로 인쇄하는 방법을 알고 있지만 내 예에는 포함하지 않았습니다.
편집 2: 또한 나중에 범위를 동적으로 만들 수 있도록 NF를 사용하여 awk로 필드 수를 계산하는 방법도 알고 있습니다. 이것이 저의 장기 목표입니다.
답변1
첫 번째 필드로 시작하는 범위
이 테스트 파일을 고려해 보겠습니다.
$ cat input.csv
a,b,c,d,e,f,g,h,i,j
최소한 GNU awk를 사용하면 다음과 같이 처음 5개(또는 다른 숫자) 필드를 인쇄할 수 있습니다.
$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e
명확성보다 간결성을 중시하는 사람들을 위해 다음과 같이 작성할 수 있습니다.
$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e
동적 크기 조정
앞의 필드 수에 관계없이 마지막 2개 필드를 무시하려면 다음을 수행하세요.
$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h
기타 범위
필드의 시작과 중지를 인쇄하려면 루프가 필요합니다.
$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f
세 번째 필드에서 인쇄하고 마지막 두 필드를 동적으로 유지하려면 다음을 수행하십시오.
$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h
답변2
간단히 말하면 awk
더 유연하지만 특정 범위의 필드만 원하는 경우 다음을 사용하십시오 cut
.
cut -d, -f1-5 huge_log_file.csv
awk
이것이 필요한 전부라면 루프보다 훨씬 간단합니다.