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/ -> .*//'