grep을 사용하여 줄 끝의 파일 이름을 추출하는 방법은 무엇입니까?

grep을 사용하여 줄 끝의 파일 이름을 추출하는 방법은 무엇입니까?

ls *.CCD디렉토리 출력 사용과 같은 정보가 포함된 로그 파일이 있습니다 /var/tmp/Person.

-rwxr-xr-x    1 bv90       dkas     153698  Nov 18 13:08 WE994002.CCD

저한테는 그런 대사가 많아요.

이렇게 하면 grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"전체 줄이 복구되지만 WE994002.CCD파일 이름만 인쇄하도록 명령을 어떻게 변경합니까?

답변1

마지막 열을 인쇄합니다.

awk '{print $NF}' /var/tmp/k.log

또는

grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18" | awk '{print $NF}'

답변2

awk 문을 추가하여 다음과 같이 목록을 구문 분석합니다.

grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"| awk '{print $9}'

이 awk 문은 출력을 공백으로 구분하고 9번째 필드를 인쇄합니다.

이 경우 grep을 완전히 건너뛰고 다음과 같이 단축할 수 있습니다.

awk '/.CCD$/ && /bv90/ && /Nov 18/ {print $9}' /var/tmp/k.log

답변3

GNU grep을 사용하는 경우 이 -o옵션이 관련될 수 있습니다.

$ echo '-rwxr-xr-x 1 bv90 dkas 153698 Nov 18 13:08 WE994002.CCD' | grep -o '[^ ]*\.CCD$'
WE994002.CCD

이는 필터링하는 파일 이름에 공백이 포함되어 있지 않다고 가정합니다. 호출에서는 grep -o줄 끝에서 끝나는 공백이 아닌 문자 시퀀스와 일치하는 줄 부분만 인쇄해야 합니다. .CCD전체 명령은 다음과 같습니다.

</var/tmp/k.log grep bv90 | grep "Nov 18" | grep -o '[^ ]*\.CCD$'

답변4

파일 이름에 공백이 없고 소프트 링크가 없으면 Cyrus의 설명대로 AWK를 사용하겠습니다.

파일 이름에 공백이 있을 수 있는 경우 공백을 사용하여 이전의 모든 필드를 설명하고 다음 태그를 모두 캡처할 수 있습니다.

sed 's/\(\S\+\s\+\)\{8\}\(.*\)/\2/' logfile

첫 번째 대괄호 세트는 열을 설명하고 그 뒤에 공백이 옵니다. 이것을 8회 반복합니다. 두 번째 대괄호 세트는 역참조 \2에 의해 캡처되는 나머지 줄을 캡처합니다.

소프트 링크를 제거해야 한다면 Cas가 말한 것처럼 또 다른 sed 명령이 필요하다고 확신합니다.

sed 's/\(\S\+\s\+\)\{8\}\(.*\)/\2/ ; s/ -> .*//'

관련 정보