1부터 특정 라인까지 문자열을 grep

1부터 특정 라인까지 문자열을 grep

저는 Linux에서 작업 중이며 다음 명령을 실행하고 있습니다.

$ ls -t postgresq*.log | head -n1 | xargs grep "ALTER USER"  
< pg_user 2021-07-15 05:03:41.609 EDT > LOG:  statement: ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';

하지만 나는 다음 문자열을 grep하고 싶습니다.

ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';

답변1

그냥 -o(에서 man grep)를 사용하세요:

$ man grep | grep -P -A1 -- '^\s+-o'
       -o, --only-matching
              Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

줄에서 일치하는 부분 -o만 인쇄 되므로 간단히 검색하여 끝까지 모든 항목을 일치시킬 수 있습니다.grepALTER USER.*ALTER USER

$ ls -t postgresq*.log | head -n1 | xargs grep -oP 'ALTER USER.*'
ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';

알아채다출력 구문 분석ls일반적으로 좋은 생각은 아니지만 이러한 로그 파일의 이름은 단순해야 하므로 안전할 수 있습니다.

답변2

zsh셸을 사용하여 sed찾고 있는 줄을 찾고 수정합니다.

sed '/ALTER USER/ s/.*statement: //' postgresq*.log(.om[1])

와일드카드 패턴은 postgresq*.log(.om[1])다음에 자세히 설명되어 있습니다.내 대답도착하다이전 질문. 즉, 이름이 패턴과 일치하는 가장 최근에 수정된 일반 파일의 이름으로 확장되거나 postgresq*.log, 패턴과 일치하는 이름이 없으면 오류가 발생합니다.

표현 sed방식

/ALTER USER/ s/.*statement: //

주어진 파일에서 문자열을 포함하는 모든 줄을 찾은 ALTER USER다음 줄의 시작 부분부터 문자열 뒤의 공백까지 모든 것을 제거합니다 statement:.

관련 정보