로그 처리/항목 삭제, 다중 파이프라인(grep sed grep), 로그 순회 2회. 이 솔루션을 개선할 수 있습니까?

로그 처리/항목 삭제, 다중 파이프라인(grep sed grep), 로그 순회 2회. 이 솔루션을 개선할 수 있습니까?

더 깨끗한 방법이 있습니까? 큰 input.txt 파일의 단일 패스가 선호됩니다. 지금까지의 솔루션:

grep -e "\[.*fred" input.txt |sed 's/.*\[\([^]]*\)\].*/\1/g' |grep -vf /dev/stdin input.txt

설명하다:

grep -e "\[.*fred" input.txt |

줄에서 "fred" 앞에 여는 괄호가 있는 "fred"라는 레이블이 붙은 줄을 찾습니다. 발행자

sed 's/.*\[\([^]]*\)\].*/\1/g' |

파일의 모든 "fred" 항목을 식별하는 대괄호 사이의 ID를 찾습니다. 각 "fred" 태그에 대한 동일한 ID 항목의 수는 고정되어 있지 않습니다. 예에서는 각 "fred"에 대해 2개의 행을 표시하지만 임의의 숫자일 수 있습니다. 발행자

grep -vf /dev/stdin input.txt

파일에서 이러한 ID를 가진 모든 줄을 삭제합니다. (필요에 따라 /dev/stdin을 "-"로 바꾸십시오. 즉, 파이프 입력)

입력.txt:

Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

원하는 출력:

Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

답변1

삭제하고 싶으시다면파일의 어느 곳에서나행이 파일의 어느 위치에서든 추출된 ID와 일치하는 경우 이 작업을 한 번에 수행할 수 없습니다.

그러나 가장 최근에 일치된 행만 삭제해야 하는 경우 다음을 수행할 수 있습니다.

$ perl -lne '$pid = $1 if /(\[.*?\]).*fred/; print unless index($_,$pid) > -1' input.txt 
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

관련 정보