A maioria das soluções com awk deixa espaço. As opções aqui evitam esse problema.
Opção 1
Uma solução de corte simples (funciona apenas com delimitadores únicos):
command | cut -d' ' -f3-
opção 2
Forçando um awk re-calc às vezes remova o espaço inicial adicionado (OFS) restante removendo os primeiros campos (funciona com algumas versões do awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Opção 3
Imprimir cada campo formatado com printf
dará mais controle:
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8
No entanto, todas as respostas anteriores alteram todos os FS repetidos entre os campos para OFS. Vamos criar algumas opções que não fazem isso.
Opção 4 (recomendado)
Um loop com sub para remover campos e delimitadores na frente.
E usando o valor de FS em vez de espaço (que pode ser alterado).
É mais portátil e não aciona uma alteração do FS para OFS:
NOTA: O ^[FS]*
é aceitar uma entrada com espaços à esquerda.
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3 4 5 6 7 8
Opção 5
É bem possível criar uma solução que não adicione espaços em branco extras (iniciais ou finais) e preserve os espaços em branco existentes usando a função gensub
do GNU awk, da seguinte maneira:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{ print(gensub(a""b""c,"",1)); }'
3 4 5 6 7 8
Também pode ser usado para trocar um grupo de campos com uma contagem n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{
d=gensub(a""b""c,"",1);
e=gensub("^(.*)"d,"\\1",1,$0);
print("|"d"|","!"e"!");
}'
|3 4 5 6 7 8 | ! 1 2 !
Obviamente, nesse caso, o OFS é usado para separar ambas as partes da linha, e o espaço em branco à direita dos campos ainda é impresso.
NOTA: [FS]*
é usado para permitir espaços à esquerda na linha de entrada.
grep | awk
é um antipattern - você querawk '/!/ { print $2 }'