다음 로그 출력 조각이 있습니다.
Server Server: Server
Date and Time: June 04 2018 14:10:00
--
Product Version User Host IP Duration
Software1 11.0 user user *.**.***.*** 10:08
Software2 11.0 user user *.**.***.*** 10:05
===================================================================================
나는 의사 소통하고 싶다자르다명령은 출력만 필터링합니다. 예:
Product Version Host IP Duration
Software1 11.0 user *.**.***.*** 10:08
Software2 11.0 user *.**.***.*** 10:05
또한 위의 첫 번째 예에서는 파일 전체에서 반복되므로 동일한 필터를 여러 번 적용하는 것이 가능한지 궁금합니다.
답변1
cut
이 경우 데이터 열이 명확하게 정의되지 않았기 때문에 실제로 사용할 수 없습니다 . 이 cut
유틸리티는 정확히 3개의 공백이나 탭 또는 가지고 있는 구분 기호와 같이 숫자를 정확하게 잘라서 작동합니다. 이 경우 이를 사용하여 입력 줄을 연속된 공백 수에 관계없이 분할해야 합니다 awk
(기본값).
$ awk -v OFS="\t" '/^==/ { next } NR > 4 { print $1, $2, $4, $5, $6 }' file | column -t
Product Version Host IP Duration
Software1 11.0 user *.**.***.*** 10:08
Software2 11.0 user *.**.***.*** 10:05
프로그램은 awk
5행에서 시작하는 모든 행 ==
과 5행 이전의 모든 행을 건너뜁니다. 다른 모든 행의 경우 필드의 선택 사항을 인쇄합니다(세 번째 행 아님 User
).
마지막으로 column -t
결과는 멋진 테이블로 형식화됩니다.
답변2
awk를 사용하세요:
awk '/--/{flag=1; next} /====/{flag=0} flag' filename
SED 사용:
sed -n '/--/,/===/{/--/!{/===/!p}}' filename
grep을 사용하세요:
grep -E 'Product|Mathematica|MathKernel|Syntax' filename
답변3
가장 간단한 해결책을 찾았습니다.
awk '{print $1,$2,$4,$5,$6}' file1.log > file2.log
내가 원하는 열만 인쇄할 수 있습니다.
Product Version Host IP Duration
Software1 11.0 User *.**.***.*** 10:08
Software2 11.0 User *.**.***.*** 10:05
중요한 용도를 몰랐어요awk