Preciso de ajuda para descobrir como usar o comando sed para mostrar apenas a primeira e a última coluna em um arquivo de texto. Aqui está o que tenho até agora para a coluna 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Minha fraca tentativa de mostrar a última coluna também foi:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
No entanto, isso pega a primeira e a última coluna e as mescla em uma lista. Existe uma maneira de imprimir a primeira e a última colunas claramente com os comandos sed e awk?
Entrada de amostra:
foo|dog|cat|mouse|lion|ox|tiger|bar
Respostas:
Quase lá. Basta colocar as duas referências de coluna próximas uma da outra.
Observe também que você não precisa
cat
aqui.Observe também que você pode dizer
awk
que os separadores de coluna são|
, em vez de espaços em branco, para que você também não precisesed
.Conforme as sugestões de Caleb , se você deseja uma solução que ainda gera o último campo, mesmo se não houver exatamente oito, pode usar
$NF
.Além disso, se você deseja que a saída retenha os
|
separadores, em vez de usar um espaço, é possível especificar os separadores do campo de saída. Infelizmente, é um pouco mais desajeitado do que apenas usar a-F
bandeira, mas aqui estão três abordagens.Você pode atribuir os separadores de campo de entrada e saída em
awk
si, no bloco BEGIN.Você pode atribuir essas variáveis ao chamar
awk
da linha de comando, através do-v
sinalizador.ou simplesmente:
fonte
|
como um separador de saída, em vez do espaço padrão para concatenação de cadeias. Você também pode explicar como usar, em$NF
vez de codificação,$8
para obter a última coluna.Apenas substitua do primeiro ao último
|
por um|
(ou espaço, se preferir):Note que, embora não exista uma
sed
implementação|
especial (desde que expressões regulares estendidas não sejam ativadas por meio-E
ou-r
em algumas implementações),\|
ela própria é especial em algumas como o GNUsed
. Portanto, você não deve escapar|
se pretende que ele corresponda ao|
personagem.Se estiver substituindo por espaço e se a entrada já puder conter linhas com apenas uma
|
, será necessário tratar isso especialmente como|.*|
não corresponderá àquelas. Isso pode ser:(ou seja, torne a
.*|
peça opcional) Ou:ou:
Se você deseja o primeiro e o oitavo campos, independentemente do número de campos na entrada, é apenas:
(todos eles funcionariam com qualquer utilitário compatível com POSIX, assumindo que a entrada forma texto válido (em particular, esses
sed
geralmente não funcionarão se a entrada tiver bytes ou sequências de bytes que não formam caracteres válidos no código de idioma atual, por exemplo,printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
em uma localidade UTF-8)).fonte
Você está usando
awk
assim mesmo:fonte
|
o espaço) com-F\|
ou similar? E se ele quisesse usar o mesmo delimitador para saída?Se você se sentir desajeitado e sem sedas, poderá conseguir o mesmo com os coreutils:
fonte
cut
é mais limpo e mais compacto que o awk / sed quando você está apenas interessado na primeira coluna ou se os delímetros são fixos (ou seja, não é um número variável de espaços).Parece que você está tentando obter o primeiro e o último campos de texto delimitados por
|
.Eu assumi que seu arquivo de log contém o texto como abaixo,
E você quer a saída como,
Se sim, então aqui vem o comando para o seu
Através do GNU sed,
Exemplo:
fonte
Você provavelmente deveria fazê-lo com
sed
- eu faria assim mesmo - mas, apenas porque ninguém escreveu este ainda:SAÍDA
fonte