이를 사용하여 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는 고려할 옵션이 되어서는 안됩니다.
2단계 접근 방식을 사용하고 먼저 각 열의 최대 너비와 정렬을 결정한 다음 모든 Unix 시스템의 모든 셸에서 awk를 사용하여 인쇄할 때 이를 사용합니다.
$ 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