Eu tenho um arquivo que contém as seguintes linhas:
/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com
Na saída acima, quero extrair 3 campos (número 2, 4 e o último *.example.com
). Estou recebendo a seguinte saída:
cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001 tomcat7.1
tc0001 tomcat7.2
tc0001 tomcat7.5
Como também extraio o último campo com o nome de domínio que é posterior '='
? Como uso multiple delimiter
para extrair o campo?
awk
command-line
text-processing
Satish
fonte
fonte
awk
foi engolir campos quando estavam em branco, o que prejudicou a numeração dos campos. Mudei-F " "
para-F "[ ]"
eawk
não engoli mais os campos vazios.Respostas:
O delimitador pode ser uma expressão regular.
Produz:
fonte
cat
processo não é necessária:awk '...' file
. Além disso, seria mais arrumado para usar o separador de campo de saída:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
|
: ex:awk -F 'this|that|[=/]' '......'
(útil para ter palavras / sequências que separam as coisas) (observe que isso mantém os espaços nos campos entre 2 separadores. A adição também|[ \t]+
pode ser útil, mas pode fazer coisas complicado ... como muitas vezes há espaços antes e depois 'isto', isso vai fazer 2 campo vazio extra de aparecer em entre o espaço (s) e 'isto')Boas notícias!
awk
O separador de campos pode ser uma expressão regular. Você só precisa usar-F"<separator1>|<separator2>|..."
:Devoluções:
Aqui:
-F"/|="
define o separador do campo de entrada como/
ou=
. Em seguida, define o separador do campo de saída como uma guia.-vOFS='\t'
está usando o-v
sinalizador para definir uma variável.OFS
é a variável padrão para o separador de campos de saída e é definida como o caractere de tabulação. A bandeira é necessária porque não há um built-in para o OFS como-F
.{print $3, $5, $NF}
imprime os terceiro, quinto e último campos com base no separador de campos de entrada.Veja outro exemplo:
Este arquivo possui dois separadores de campos
#
e_
. Se quisermos imprimir o segundo campo, independentemente de o separador ser um ou outro, vamos fazer com que ambos sejam separadores!Onde os arquivos são numerados da seguinte maneira:
fonte
Se seu espaço em branco for consistente, você poderá usá-lo como um delimitador, também em vez de inserir
\t
diretamente, você poderá definir o separador de saída e ele será incluído automaticamente:fonte
Para um campo de separação de qualquer número
2
através5
ou cartaa
ou#
ou um espaço, em que o personagem de separação devem ser repetidos pelo menos 2 vezes e não mais do que 6 vezes, por exemplo:Tenho certeza de que existem variações disso usando () e parâmetros
fonte
One-liner Perl:
Essas opções de linha de comando são usadas:
-n
faça um loop em todas as linhas do arquivo de entrada, coloque a linha na$_
variável, não imprima automaticamente todas as linhas-l
remove as novas linhas antes do processamento e as adiciona novamente depois-a
modo de divisão automática - o perl dividirá automaticamente as linhas de entrada na@F
matriz. O padrão é dividir em espaço em branco-F
modificador de divisão automática, neste exemplo se divide em um/
ou=
-e
executar o código perlPerl está intimamente relacionado ao awk, no entanto, a
@F
matriz de divisão automática inicia no índice$F[0]
enquanto os campos do awk começam com $ 1.fonte
Outra é usar a opção -F, mas passe-a regex para imprimir o texto entre parênteses esquerdo e / direito
()
.O conteúdo do arquivo:
O comando:
resultado:
Usando o awk para imprimir apenas o texto entre
[]
:Use,
awk -F'[][]'
masawk -F'[[]]'
não funcionará.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
fonte
Vejo muitas respostas perfeitas no quadro, mas ainda gostaria de enviar meu código também,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'
fonte
print $3 " " $5 " " $7
pode ser impresso comoprint $3, $5, $7
. Além disso, não vejo a vantagem de usar o awk e depois canalizá-lo para o sed. Em geral, o awk pode ser suficiente e outras respostas mostram isso.