awk의 각 라인에 대해 외부 명령을 반복하십시오.

awk의 각 라인에 대해 외부 명령을 반복하십시오.

클립보드에는 다음 내용이 포함되어 있습니다.

curl "foo" --compressed ;
curl "bar" --compressed ;
curl "baz" --compressed ;

다음 명령은 각 클립보드 줄에 대해 한 줄을 만듭니다.

pbpaste | awk '{"pwgen 10 1" | getline pass; print substr($0, 1, length($0) -1) ">>myfile-" pass ".jpg"}'

다음 출력을 생성합니다.

curl "foo" --compressed >>myfile-du7EeHegh7.jpg
curl "bar" --compressed >>myfile-du7EeHegh7.jpg
curl "baz" --compressed >>myfile-du7EeHegh7.jpg

질문:

여기서 문제는 pwgen 10 1처음에는 한 번만 실행되는 것처럼 보이지만 새로운 클립보드 줄마다 실행되어 각 줄에 대해 새로운 고유 파일 이름을 생성하기를 원한다는 것입니다. pwgen처음에 한 번만 호출되는 대신 반복적으로 호출되도록 하려면 어떻게 해야 합니까 ?

원하는 출력:

# each filename is unique
curl "foo" --compressed >>myfile-zus83j10ai.jpg
curl "bar" --compressed >>myfile-nbjfo2pa9d.jpg
curl "baz" --compressed >>myfile-ahqdugpo90.jpg

답변1

awk에서 외부 명령을 사용하고 사용하십시오.getline from a Pipe, 명령을 변수에 할당한 my_command="my external command here"다음 이를 사용하여 호출하는 my_command |getline to_save것이 더 좋습니다.close(my_command)각 실행마다 출력을 다르게 하기 위한 것입니다. 또한 명령이 실행되지 않도록 close(my_command)in 블록을 실행하는 것이 좋습니다 .BEGIN{...}my_command

또한 getline 반환 코드를 테스트하고 성공하면 계속 진행해야 합니다.

pbpaste |awk 'BEGIN{ close(cmd); }
{ cmd="pwgen 10 1";
  if (cmd | getline pass) {
      print substr($0, 1, length($0) -1) ">>myfile-" pass ".jpg";
      close(cmd);
  } else { print "running command failed!"; exit 1; }
}'

그러나 명령 자체가 실패하면 명령 성공/실패를 확인하지 않기 때문에 getline은 여전히 ​​성공 반환 코드를 반환합니다.

pbpaste |awk 'BEGIN{ close(cmd); }
{ cmd="pwgen 10 1 || echo failed";
  if ((cmd | getline pass)>0 && pass!="failed") {
      print substr($0, 1, length($0) -1) ">>myfile-" pass ".jpg";
      close(cmd);
  } else { print "running command failed!"; exit 1; }
}'

매뉴얼 인용 :

파일명이 동일하거나동일한 쉘 명령getline awk 프로그램 실행 중에 여러 번 사용됨(getline을 사용한 명시적 입력 섹션을 참조하세요.), 파일이 열립니다(또는명령이 실행됩니다) 처음에만. 이 시점에서 파일이나 명령에서 첫 번째 입력 레코드를 읽습니다. 다음에 동일한 파일이나 명령이 getline과 함께 사용되면 여기에서 다른 레코드를 읽는 식으로 진행됩니다.

위 링크에서getline을 사용한 명시적 입력말하는:

getline 명령은 레코드가 발견되면 1을 반환하고 파일의 끝이 발견되면 0을 반환합니다. 레코드를 검색하는 동안 파일을 열 수 없는 등 오류가 발생하면 getline은 -1을 반환합니다. 이 경우 gawk는 ERRNO 변수를 발생한 오류를 설명하는 문자열로 설정합니다.

또한보십시오:

관련 정보