Outra forma AWK é tratar cada diretório como um registro separado, em vez de um campo separado .
awk 'BEGIN{RS=":"} {print $0}' <<<"$PATH"
Acho essa sintaxe particularmente intuitiva. Mas, se quiser, você pode reduzi-lo, tornando o print $0
implícito (é a ação padrão e 1
é avaliado como verdadeiro, fazendo com que seja feito para cada linha):
awk 'BEGIN{RS=":"} 1' <<<"$PATH"
O separador de registro de entrada e saída padrão do AWK é a nova linha (quebra de linha). Ao definir o separador de registro de entrada ( RS
) como :
antes de ler a entrada, o AWK analisa automaticamente um $PATH
com delimitação de dois pontos em seus nomes de diretório constitutivos. O AWK expande $0
para cada registro inteiro, a nova linha continua a ser o separador de registro saída e não é necessário loop ou gsub
.
ek@Io:~$ echo "$PATH"
/home/ek/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ek@Io:~$ awk 'BEGIN{RS=":"} {print $0}' <<<"$PATH"
/home/ek/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
O AWK costuma ser usado para analisar registros em campos separados, mas não há necessidade de apenas construir uma lista de nomes de diretório.
Isso funciona até mesmo para entradas contendo espaços em branco (espaços e tabulações), até vários espaços em branco consecutivos:
ek@Io:~$ awk 'BEGIN{RS=":"} {print $0}' <<<$'ab\t\t c:de fg:h'
ab c
de fg
h
Ou seja, a menos que você faça com que o AWK reconstrua o registro (veja abaixo), não há problema em ter espaços ou tabulações (os separadores de campo padrão) na entrada. Seu PATH
provavelmente não contém espaços em um sistema Ubuntu, mas se funcionar, isso ainda funcionará.
Vale a pena mencionar, como uma nota lateral, que a capacidade do AWK de interpretar um registro como uma coleção de campos se torna útil para o problema relacionado à construção de uma tabela de diretório componentes :
ek@Io:~$ awk -F/ 'BEGIN{RS=":"; OFS="\t"} {$1=$1; print $0}' <<<"$PATH"
home ek bin
usr local sbin
usr local bin
usr sbin
usr bin
sbin
bin
usr games
usr local games
snap bin
A curiosa atribuição $1=$1
serve para forçar o AWK a reconstruir o registro .
(Isto é provavelmente mais útil para casos em que o processamento adicional deve ser feito nos componentes, do que para o exemplo exato mostrado simplesmente para imprimir a tabela.)