lsof 출력을 열별로 구분

lsof 출력을 열별로 구분

아래 명령을 사용하고 열을 분리하려고 하는데 Python 스크립트에서 PID를 사용하도록 하고 싶습니다.

이 행을 쉽게 얻을 수 있지만 해킹되지 않은 방식으로 열로 분할하는 방법은 무엇입니까?

공간으로 쉽게 나눌 수 있지만 현실적으로 그것은 끔찍한 생각입니다. 어떤 제안이 있습니까?

root@python-VirtualBox:/var/python# lsof | grep TCP
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    3449 root    3u  IPv4  24248      0t0  TCP *:22 (LISTEN)
sshd    3449 root    4u  IPv6  24257      0t0  TCP *:22 (LISTEN)

답변1

lsof명령은 매우 다양하며 다양한 검색 기준을 지정할 수 있습니다. 특히 이 -i옵션을 사용하면 인터넷 주소(프로토콜 포함)로 검색할 수 있으므로 grep검색할 필요가 없습니다. 그래서 당신은 교체 할 수 있습니다

lsof | grep TCP

그리고

lsof -i TCP

lsof또한 이 옵션을 사용하면 관심 있는 필드를 지정 -F하고 해당 필드만(한 줄에 하나씩) 출력할 수 있습니다. 그래서 우리는 할 수 있습니다

lsof -i TCP -F 'p'

TCP를 사용하는 프로세스의 PID 목록을 인쇄합니다.

그러나 각 PID에는 "p" 접두사가 붙으므로(예: "p156") 궁극적으로 이를 사용하여 cut숫자 ID를 얻을 수 있습니다. 이것은 우리에게 마지막 명령을 제공합니다

lsof -i TCP -F 'p' | cut -c 2-

물론 @RobertL의 답변도 매우 훌륭하지만 저는 AWK를 사용하지 않고 모든 텍스트 처리 문제를 해결하도록 도전하고 싶습니다.

답변2

awk나는 이것이 당신을 위해 필드를 분할하기 때문에 이점이 있다고 생각합니다 .

lsof | awk '$8 == "TCP" { print $2 }'

필드 8이 "TCP"이면 필드 2가 인쇄됩니다.

답변3

존재하다:

lsof -iTCP -Fp

나가:

p1135                                
p6326                                                                  
p16841                                                                 
p18130                                                                 
p37908                                                                 
p41768                                                                 
p51944                                                                 
p71882                                                                 
p74759                                                                 
p79636                                                                 
p82203                                

답변4

실제로 안전한 유일한 옵션은 eg를 사용한 lsof -F0pn다음 다른 프로그래밍 언어를 사용하여 출력을 구문 분석하는 것입니다. 이 경우 lsof는 null 바이트로 구분된 필드를 내보내고 각 필드는 필드 유형을 지정하는 문자로 시작됩니다. 예를 들어 p123<NULL>n/var/log/syslog<NULL>PID 123으로 열린 파일의 이름은 입니다 /var/log/syslog. 프로세스에 여러 파일이 열려 있으면 p(PID) 필드가 한 번만 나열되고 n파일을 설명하는 여러 (이름) 필드가 나타납니다.

또한 플래그 가 p있는 필드를 요청하더라도 다른 필드가 방출될 수 있으므로 관심 없는 필드는 무시할 준비를 하십시오.n-Flsof

이는 lsofPOSIX 사양의 일부이며 역사적인 이유로 인해 다음과 같은 이상한 동작이 발생합니다.https://www.unix.com/man-page/posix/8/lsof/

관련 정보