Existe alguma maneira de especificar um delimitador de campo para mais espaços com o comando recortar? (como "" +)? Por exemplo: Na sequência a seguir, eu gostaria de atingir o valor '3744', que delimitador de campo devo dizer?
$ps axu | grep jboss
jboss 2574 0.0 0.0 3744 1092 ? S Aug17 0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0
cut -d' '
não é o que eu quero, pois é apenas para um único espaço.
awk
também não é o que estou procurando, mas como fazer com 'cut'?
obrigado.
tr
como mostrado aqui: stackoverflow.com/a/4483833/168143ps
+grep
você pode usar opgrep
que está disponível na maioria das distribuições modernas. Ele retornará o resultado exatamente da forma que você precisa.Respostas:
Na verdade,
awk
é exatamente a ferramenta que você deve procurar:ou você pode se livrar
grep
completamente, poisawk
conhece expressões regulares:Mas se, por algum motivo bizarro, você realmente não puder usar
awk
, existem outras coisas mais simples que você pode fazer, como recolher todo o espaço em branco em um único espaço primeiro:A
grep
propósito, esse truque é uma maneira interessante de obter apenas osjboss
processos e não ogrep jboss
único (idem para aawk
variante também).O
grep
processo terá um literalgrep [j]boss
em seu comando de processo, portanto não será capturado pelogrep
próprio, que está procurando a classe de caracteres[j]
seguida porboss
.Essa é uma maneira bacana de evitar o
| grep xyz | grep -v grep
paradigma que algumas pessoas usam.fonte
grep
truque parece não funcionar em arquivos crontab. Qualquer razão?awk
A versão é provavelmente o melhor caminho a percorrer, mas você também pode usá-cut
lo se primeiro apertar as repetições comtr
:fonte
tr -s ' '
é muito bom! Espero que eu possa lembrar que melhor do queawk
Eu gosto de usar o comando tr -s para isso
Isso reduz todos os espaços em branco para 1 espaço. Dessa maneira, dizer ao corte para usar um espaço como delimitador é honrado como esperado.
fonte
Vou nomear
tr -s [:blank:]
como a melhor resposta.Por que queremos usar corte? Ele tem o comando mágico que diz "queremos o terceiro campo e todos os campos depois dele, omitindo os dois primeiros campos"
Eu não acredito que exista um comando equivalente para o awk ou o perl split, onde não sabemos quantos campos haverá, ou seja, colocamos o terceiro campo no campo X.
fonte
Solução mais curta / mais simples: use
cuts
(corte em esteróides que escrevi)Observe que
cuts
os índices de campo são baseados em zero, portanto, o quinto campo é especificado como 4http://arielf.github.io/cuts/
E ainda mais curto (sem usar o corte) é:
fonte
Uma maneira de contornar isso é:
para substituir vários espaços consecutivos por um único.
fonte
\s
é uma extensão GNU sed. No OS X, você pode passar o-E
sinalizador para sed para habilitar expressões regulares estendidas e, em seguida, usar[[:space:]]
no lugar de\s
, da seguinte maneira:sed -E 's/[[:space:]]+/ /g'
Pessoalmente, costumo usar o awk para trabalhos como este. Por exemplo:
fonte
ps axu | awk '/[j]boss/ {print $5}'
.Como alternativa, sempre há perl:
Ou, se você deseja obter todos os campos começando no campo 3 (conforme indicado em uma das respostas acima):
fonte
lsof
tenteilsof|perl -lane 'print $F[5]'
isso às vezes recebe a 5ª coluna, por vezes, a 6ªSe você deseja escolher colunas de uma saída ps, existe algum motivo para não usar -o?
por exemplo
Largura mínima da coluna alocada, sem preenchimento, apenas separador de campo de espaço único.
Pid e vsz recebem 10 caracteres de largura e 1 separador de campo de espaço.
Usado em um script: -
fonte
Outra maneira, se você deve usar o comando cut
No Solaris, substitua o awk por
nawk
ou/usr/xpg4/bin/awk
fonte
Ainda gosto da maneira como o Perl lida com campos com espaço em branco.
O primeiro campo é $ F [0].
fonte
Minha abordagem é armazenar o PID em um arquivo em / tmp e encontrar o processo correto usando a
-S
opção forssh
. Isso pode ser um mau uso, mas funciona para mim.Uma abordagem melhor seria procurar o
SSH_PID
direito antes de matá-lo, pois o arquivo pode estar obsoleto e mataria um processo errado.fonte