Acho que awk
é bom para isso porque divide os campos para você:
lsof | awk '$8 == "TCP" { print $2 }'
Se o campo 8 for "TCP", imprima o campo 2.
Eu estou usando este comando abaixo e tentando separar as colunas Eu só quero pegar o PID para usá-lo no meu script python.
Eu posso facilmente obter essa linha por linha, mas como separar as colunas de uma maneira não hacky?
Eu posso dividir o espaço facilmente, mas vamos encarar isso, é uma idéia terrível, alguma sugestão?
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)
O comando lsof
é bastante completo, permitindo que você especifique vários critérios de pesquisa diferentes. Em particular, a opção -i
permite pesquisar por endereço na Internet, incluindo protocolo, tornando grep
desnecessária. Então você poderia substituir
lsof | grep TCP
com
lsof -i TCP
lsof
também permite que você especifique em quais campos você está interessado com a opção -F
e apenas gera aqueles (um em cada linha). Então nós podemos fazer
lsof -i TCP -F 'p'
para gerar uma lista de PIDs para processos que estão usando TCP.
No entanto, cada um desses PIDs é prefixado com um "p" (por exemplo, "p156"), então, finalmente, podemos usar cut
para obter o ID numérico. Isso nos dá um comando final de
lsof -i TCP -F 'p' | cut -c 2-
É claro que a resposta de @ RobertL também está perfeitamente bem, mas eu gosto de me desafiar a não usar o AWK para resolver todos os meus desafios de processamento de texto.
lsof -iTCP -Fp
p1135
p6326
p16841
p18130
p37908
p41768
p51944
p71882
p74759
p79636
p82203
Tags text-processing lsof