awk에서 Linux 쉘 명령을 사용하는 방법이 있습니까? (주어진) 텍스트 파일에서 사용자가 존재하는지 확인하고 아래와 같이 존재하지 않는 사용자를 새 텍스트 파일에 써야 합니다.username [email protected]
username password [email protected]
현재 나는 이것을 가지고 있습니다 :
#!/bin/bash
awk '{
for(i=1; i<=NF; i+=2) {
pass='pwgen'
if(id -u $i | awk '{$1}' > 999) print $1;
else $i pass $i,'@email.com' >> newusers.txt
}
}' $*
나는 그것이 작동해야한다고 생각했지만 분명히 그렇지 않습니다. 별칭 pwgen(사용당 1개의 비밀번호 생성)을 사용하여 새 비밀번호를 생성해야 하며, id -u $i |의 출력을 비교하여 텍스트 파일의 $i 요소가 기존 사용자인지 확인해야 합니다. awk '{$1}'을 999로, 999를 넘지 않으면 newusers.txt라는 텍스트 파일에 추가해야 합니다.username password [email protected]
답변1
당신의 awk 스크립트
{ for(i=1; i<=NF; i+=2) { 작성자: pwgen if(id -u $i | awk {ARG1} > 999) $1을 인쇄합니다. 그렇지 않으면 $i가 $i,@email.com >> newusers.txt를 전달합니다. } }
ARG1
쉘 스크립트에 전달된 첫 번째 인수는 어디에 있습니까? 쉘 스크립트의 첫 번째 작은따옴표는 작은따옴표 리터럴을 시작하고, 이후 두 번째 작은따옴표로 끝납니다 | awk {
. 세 번째 작은따옴표는 또 다른 작은따옴표 리터럴을 시작하고 네 번째 작은따옴표로 끝나는 식입니다. 작은 따옴표를 포함하려면 따옴표를 붙여야 합니다. 하지만 여기서는 어쨌든 awk 스크립트에서 작은따옴표를 사용할 필요가 없습니다. awk의 문자열은 큰따옴표로 묶어야 합니다.
pass=pwgen
이 awk 코드 줄은 변수를 pass
변수의 값으로 설정합니다 pwgen
. pwgen
설정되어 있지 않으므로 null pass
값으로 설정됩니다.
작성하고 싶을 수도 있습니다 pass=`pwgen`
. 이것은 쉘 변수를 pass
명령의 출력으로 설정하는 쉘 구문입니다 pwgen
. 그러나 이것은 awk가 아닌 쉘 구문이므로 awk에서는 작동하지 않는 것이 당연합니다. 파이프 구문을 사용하여 awk에서 명령의 출력을 읽을 수 있습니다.
pwgen | getline pass;
close("pwgen");
파이프를 닫아야 합니다. 그렇지 않으면 다음에 명령이 실행될 때 실행 중인 새 인스턴스 대신 동일한 파이프에서 읽습니다 pwgen
.
if(id -u $i | awk '{$1}' > 999) print $1;
이 system
함수를 사용하여 쉘 명령을 실행할 수 있습니다. 귀하가 작성한 내장 awk 명령이 의미가 없습니다. 출력이 id -u
999보다 큰지 테스트하고 싶은 것 같습니다.
if (system("id -u " $i "| awk \x27{exit(!($0 > 999))}\x27"))
\x27
awk 문자열에 작은따옴표 문자를 넣는 방법입니다. 하지만 정말 복잡해요. 대신 id -u
awk 스크립트의 출력을 읽으세요.
id_command = "id -u " $i;
id_command | getline id;
close(id_command);
if (id > 999) print id;
else $i pass $i,'@email.com' >> newusers.txt
파일에 한 줄을 쓰는 것을 의미한다고 생각합니다. 따라서 인쇄 명령이 필요합니다. 요소 사이에 공백을 추가하려면 공백을 별도의 인수로 전달하세요 print
. 공백 없이 두 문자열을 연결하려면 awk 스크립트에서 사이에 연산자 없이 문자열을 서로 옆에 배치합니다(awk에서 빈 이진 연산자는 연결을 의미합니다). 우리가 여러 번 보아왔듯이 문자열 주위에 큰따옴표를 사용하십시오.
else print $i, pass, $i "@email.com" >>"newusers.txt"
귀하의 스크립트에 제가 완전히 검토하지 않은 다른 문제가 있을 수 있습니다.