lsof 출력에서 ​​pid 열과 경로 이름 열만 추출하는 방법은 무엇입니까?

lsof 출력에서 ​​pid 열과 경로 이름 열만 추출하는 방법은 무엇입니까?
$ sudo lsof -u t  |   grep -i "\.pdf" 

evince  1788    t   37r      REG                8,4    176328     134478 /home/t/some/path1/white space/string1 + string2 string3.pdf
evince  3737    t   36r      REG                8,4   1252636    6692680 /home/t/some/path2/white space/string5 string3.pdf

두 번째 열(프로세스의 pid)만 추출하려면 어떻게 해야 합니까?

9번째 열(파일 경로명)만 추출하는 방법은 무엇입니까? (경로 이름에는 Linux 및 ext4 파일 시스템에서 허용하는 모든 문자가 포함될 수 있습니다.)

내 진짜 명령은

$ sudo lsof -u t  | grep -v "wineserv" | grep REG  |   grep "\.pdf" | grep  "string"

wineserv첫 번째 열 "COMMAND"가 이 아니고 , 다섯 번째 열 "TYPE"이 이고 REG, 아홉 번째 열 "NAME"에 .pdf및 이 포함된 레코드를 검색하겠습니다 string.

bash, awk 또는 Python 솔루션을 선호합니다(Perl도 가능하지만 Perl을 모르기 때문에 올바른지 확인하거나 나중에 수정할 수 없습니다).

감사해요.

답변1

정규 표현식을 사용하세요:

$ ... | perl -nlE '/.*? (\d+).*?(\/.*)/ and print("$1 ; $2")' 

1788 ; /home/t/some/path1/white space/string1 + string2 string3.pdf
3737 ; /home/t/some/path2/white space/string5 string3.pdf

답변2

귀하가 요구하는 내용을 이해한다면 다음과 같이 작동합니다.

awk '{ for (i=9; i<=NF; i++) {
    if ($i ~ "string" && $1 != "wineserv" && $5 == "REG" && $NF ~ "\.pdf$") {
        $1=$2=$3=$4=$5=$6=$7=$8=""
        print
    }
}}'
  • 다음이 포함된 경우 9부터 끝까지 모든 필드를 반복합니다 string.

    • 필드 1이 다음과 같지 않은지 확인하십시오.wineserv
    • 필드 5는 다음과 같습니다.REG
    • 마지막 필드에는 다음이 포함되어 있습니다 .pdf. (파일에 공백이 있더라도 확장자는 마지막 부분에 있어야 한다고 가정해도 안전할 것 같습니다.)
  • 모든 조건이 충족되면 처음 8개 필드를 삭제하고 나머지를 인쇄합니다.

관련 정보