![인쇄하기 전에 awk에서 명령 실행](https://linux55.com/image/10620/%EC%9D%B8%EC%87%84%ED%95%98%EA%B8%B0%20%EC%A0%84%EC%97%90%20awk%EC%97%90%EC%84%9C%20%EB%AA%85%EB%A0%B9%20%EC%8B%A4%ED%96%89.png)
디렉토리 크기를 계산하는 동안 디렉토리를 나열하고 간단한 명령을 사용하여 전체 디렉토리를 인쇄하고 싶습니다.엘에스그리고앗, 목록과 표시하려는 내용을 효과적으로 제어할 수 있습니다.
ls -AlhF /usr | awk '{print $6, $7, $8, "\011", $9 }'
하지만 한 단계 더 나아가서 폴더나 파일의 크기를 확인하려면 $9 와 다음 명령을 사용하세요.Du-s이 같은:
ls -AlhF /usr | awk '{print $6, $7, $8, "\011", $9, du -s /usr/$9 }'
백틱이나 큰따옴표를 사용하여 여러 가지 방법으로 작성하려고 시도했지만 항상 오류나 원치 않는 결과가 발생했습니다.
답변1
ls
이 질문에 대답하고 지금은 구문 분석된 출력에 대한 질문을 무시하고 에서 명령의 출력(stdout)을 얻으려면 awk
다음을 수행할 수 있습니다.
cmd="that command"
output=""
while ((cmd | getline line) > 0)
output = output line RS
status = close(cmd)
종료 상태가 인코딩되는 방식상태변수는 awk
구현마다 다릅니다. 믿을 수 있는 것은 cmd
성공할 경우에만 0이 될 것이라는 점입니다.
getline
명령줄을 구문 분석하려면 셸(일반적으로 POSIX 셸이지만 일부 시스템에서는 Bourne 셸일 수도 있음)을 시작합니다. 그러므로 그 안에 있는 데이터를 정확하게 인용하는 것이 중요합니다. 가장 안전한 작은따옴표를 사용하는 것이 가장 좋습니다.
여기서 출력은 어쨌든 한 줄이므로(귀하의 메소드는 줄 바꿈은 물론이고 공백 문자가 포함된 파일 이름을 처리할 수 없습니다) 다음 한 가지만 수행하면 됩니다 getline
.
awk -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
cmd = "du -sk " shquote("/usr/" $9)
cmd | getline du_output
status = close(cmd)
}'
getline
변수 이름 없이 호출하면 $0
디스크 사용량을 더 쉽게 추출할 수 있도록 설정됩니다.
DIR=/usr export DIR
LC_ALL=C ls -l -- "$DIR" | awk -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
date = $6 " " $7 " " $8
name = $9
cmd = "du -sk " shquote(ENVIRON["DIR"] (ENVIRON["DIR"] ~ /^\/*$/ ? "" : "/") name)
cmd | getline
disk_usage = $1
print date "\t" name "\t" disk_usage
}'
답변2
ls -AlhF /usr | awk '{print "echo "$6" "$7" "$8" \011 "$9" $(du -s /usr/"$9")" }' | sh
awk를 사용하여 echo 및 du 명령을 빌드한 다음 sh로 파이프하여 실행합니다.
답변3
이는 perl
구현 입니다.아니요출력 구문 분석 ls -l
(본질적으로 신뢰할 수 없음)에 의존하며 원하는 날짜 또는 크기 출력 형식을 사용하도록 쉽게 수정할 수 있습니다.
파일에 저장하고 실행 가능하게 만든 후 로 시작합니다 /path/to/script /usr
. 스크립트에는 하나 이상의 디렉터리 이름 인수가 필요합니다.
#!/usr/bin/perl
use strict;
use Date::Format;
if ($#ARGV < 0) { die "Missing directory argument" };
foreach my $dir (@ARGV) {
$dir =~ s:/+$::; # strip trailing /
opendir(my $dh, $dir) || die "Can't opendir $dir: $!";
while (readdir $dh) {
next if (m/^\.{1,2}$/); # skip . and .. entries
my $mtime=(stat("$dir/$_"))[9]; # extract mtime field from stat
my $mtime_f = time2str('%Y-%m-%d %X', $mtime);
open(my $fh, "-|", 'du', '-s', '--', "$dir/$_");
my $du = <$fh>;
($du) = split(' ',$du); # only want the first blank-separated field
close($fh).
printf "%s\t%s\t%s\n", $mtime_f, "$dir/$_" , $du;
}
closedir $dh;
};
이를 수행하는 더 간단하고 짧은 방법(perl, awk 또는 기타 언어 사용)이 있지만 이는 디렉토리 및 해당 내용에 대한 추가 정보를 보고하는 데 유용한 기반을 제공합니다. perldoc -f stat
이 기능에 사용할 수 있는 정보에 대한 자세한 내용은 을 참조하십시오 stat()
.
그런데 이 작업은 에서 달성할 수 있지만 자체 기능과 날짜 형식 지정 기능을 awk
구현해야 합니다 . stat()
사용하기 더 편리합니다 perl
.
GNU awk
는 gawk
로드 가능한 모듈을 지원하며 이 filefuncs
모듈은 배열을 stat()
채우는 statdata[]
모듈을 제공합니다. 스크립트 상단에 추가하여 @load "filefuncs"
사용합니다 awk
.