인쇄하기 전에 awk에서 명령 실행

인쇄하기 전에 awk에서 명령 실행

디렉토리 크기를 계산하는 동안 디렉토리를 나열하고 간단한 명령을 사용하여 전체 디렉토리를 인쇄하고 싶습니다.엘에스그리고, 목록과 표시하려는 내용을 효과적으로 제어할 수 있습니다.

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 awkgawk로드 가능한 모듈을 지원하며 이 filefuncs모듈은 배열을 stat()채우는 statdata[]모듈을 제공합니다. 스크립트 상단에 추가하여 @load "filefuncs"사용합니다 awk.

관련 정보