Não sei por que
ls -hal / | awk '{print $5, $9}'
parece ser muito mais perturbador para seus processos de pensamento do que
ls -hal / | cut -d'\s' -f5,9
teria sido, se tivesse funcionado. Você realmente teria que escrever isso? Leva apenas alguns awk
linhas antes de adicionar o {}
se torna automático. (Para mim, a questão mais difícil é lembrar qual número de campo corresponde a qual parte dos dados, mas talvez você não tenha esse problema.)
Você não precisa usar todos os recursos do awk; para simplesmente a saída de colunas específicas, você precisa saber muito pouco awk.
O problema mais irritante seria se você quisesse produzir o link simbólico, assim como o nome do arquivo, ou se os nomes dos seus arquivos pudessem ter espaços neles. (Ou, pior ainda, novas linhas). Com o corte hipotético regex-consciente, isso não é um problema (exceto para as novas linhas); você apenas substituiria -f5,9
por -f5,9-
. No entanto, não há sintaxe awk para "campos de 9 até o final", e você fica com a necessidade de lembrar como escrever um loop for.
Aqui está um pequeno script de shell que transforma cut
-style -f
options em um programa awk e, em seguida, executa o programa awk. Precisa de uma verificação de erros muito melhor, mas parece funcionar. (Bônus adicionado: lida com a opção -d
passando para o programa awk).
#!/bin/bash
prog=\{
while getopts f:d: opt; do
case $opt in
f) IFS=, read -ra fields <<<"$OPTARG"
for field in "${fields[@]}"; do
case $field in
*-*) low=${field%-*}; high=${field#*-}
if [[ -z $low ]]; then low=1; fi
if [[ -z $high ]]; then high=NF; fi
;;
"") ;;
*) low=$field; high=$field ;;
esac
if [[ $low == $high ]]; then
prog+='printf "%s ", $'$low';'
else
prog+='for (i='$low';i<='$high';++i) printf "%s ", $i;'
fi
done
prog+='printf "\n"}'
;;
d) sep="-F$OPTARG";;
*) exit 1;;
esac
done
if [[ -n $sep ]]; then
awk "$sep" "$prog"
else
awk "$prog"
fi
Teste rápido:
$ ls -hal / | ./cut.sh -f5,9-
7.0K bin
5.0K boot
4.2K dev
9.0K etc
1.0K home
8.0K host
33 initrd.img -> /boot/initrd.img-3.2.0-51-generic
33 initrd.img.old -> /boot/initrd.img-3.2.0-49-generic
...