Я могу использовать его stat
для создания вывода ls, который показывает оба формата информации о разрешениях, что может быть удобно:
stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .*
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk
Однако интервал между столбцами использует , \t
что нормально, но довольно 'зазорно'. Это заставило меня полюбопытствовать, есть ли универсальный способ постобработки любых выходных данных, таких как этот, так, чтобы столбцы были в наименьшем общем знаменателе зазоров в один пробел, т. е. есть ли универсальный способ скорректировать вышесказанное до чего-то вроде нижесказанного, используя awk
или sed
или подобное (я также выравниваю по правому краю только количество столбцов как 'идеальный' выходной сигнал, если это возможно)?
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk
решение1
Что касается «или sed» в вашем вопросе, sed — это правильный инструмент для простых преобразований s/old/new/ в отдельных строках, то, что вы делаете, совсем не похоже на это, поэтому sed даже не следует рассматривать как вариант.
Используя двухпроходный подход, сначала определяем максимальную ширину и выравнивание для каждого столбца, а затем используем их при печати, используя любой awk в любой оболочке на каждой машине Unix:
$ cat tst.awk
BEGIN { FS="\t" }
NR==FNR {
for (i=1; i<=NF; i++) {
align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
width[i] = ( length($i) > width[i] ? length($i) : width[i] )
}
next
}
{
for (i=1; i<NF; i++) {
printf "%" align[i] width[i] "s ", $i
}
print $NF
}
$ awk -f tst.awk file file
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk
Вышеуказанное предполагает, что ваш последний столбец всегда должен быть выровнен по левому краю, если это не так, дайте нам знать, так как это несложно сделать в любом случае. Также предполагается, что выравнивание столбца может быть определено значениями (числовыми или нет) в полях в последней строке ввода.
Если входные данные должны поступать из канала, а не из файла (и поэтому вы не можете открыть входные данные дважды), то вы можете сохранить входные данные в массиве и вывести их в разделе END:
$ cat tst.awk
BEGIN { FS = "\t" }
{
for (i=1; i<=NF; i++) {
width[i] = ( length($i) > width[i] ? length($i) : width[i] )
align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
vals[NR,i] = $i
}
}
END {
for (n=1; n<=NR; n++) {
for (i=1; i<NF; i++) {
printf "%" align[i] width[i] "s ", vals[n,i]
}
print vals[n,NF]
}
}
и затем назовите его так:
$ stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .* | awk -f tst.awk
решение2
Вы можете использовать column -t your_file
(но, насколько я могу судить, это не даст правильного выравнивания)
Выходы:
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk