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