awk 시스템 명령에 파이프가 있는 백슬래시

awk 시스템 명령에 파이프가 있는 백슬래시

awk에서 쉘 명령을 호출하고 싶어서 awk를 사용하고 있지만 system()표현식을 전달하면 백슬래시에서 오류가 발생합니다. 이게 내 표현이야

echo "select * from abc limit 1;"| impala-shell|grep -Eo " a-[0-9]-[0-9]* \| HS[0-9]  \| [0-9]* \| [0-9]* "

하지만 이를 쉘에 전달하면 오류가 발생합니다 backslash not last character on line.

system("echo \"select * from abc limit 1;\"| impala-shell|grep -Eo \" a-[0-9]-[0-9]* \| HS[0-9]  \| [0-9]* \| [0-9]* \" ")

awk 프로그래밍 후에 위 명령 결과를 얻고 싶습니다 system(). getline을 통해 액세스할 수 있다는 것은 알고 있지만 정확한 구문은 모릅니다.

편집하다

그것을 사용할 때\|시스템에서 다음과 같이"\|"주목을 받았다

`warning: escape sequence `\|' treated as plain `|'` 

보기 쉽게 몇 가지 간단한 예를 들었습니다.\|표현에서

system("echo hey i am  \"\\|\" ashish ")
hey i am \| ashish

하지만 큰 따옴표와 작은 따옴표 안에 넣으려고 하면 결과가 나옵니다.

system("echo \" a-[0-9]* \"\\|\" HS[0-9]  \"\\|\" [0-9]* \"\\|\" [0-9]* \" ")
a-[0-9]* | HS[0-9]  | [0-9]* | [0-9]*
//single quote
system("echo \' a-[0-9]* \"\\|\" HS[0-9]  \"\\|\" [0-9]* \"\\|\" [0-9]* \' ")
a-[0-9]* "\|" HS[0-9]  "\|" [0-9]* "\|" [0-9]*

그것이 내가 기대하는 것입니다 a-[0-9]* \| HS[0-9] \| [0-9]* \| [0-9]*.

답변1

awk의 이 문자열 리터럴

"echo \"select * from abc limit 1;\"| impala-shell|grep -Eo \" a-[0-9]-[0-9]* \| HS[0-9]  \| [0-9]* \| [0-9]* \" "

다음 문자열 값을 나타냅니다.

echo "select * from abc limit 1;"| impala-shell|grep -Eo " a-[0-9]-[0-9]* | HS[0-9]  | [0-9]* | [0-9]* " 

백슬래시 뒤에 영숫자가 아닌 다른 문자가 오면 숫자를 나타냅니다. (적어도 역사적 awk 구현과 GNU awk에서는 일부 awk 구현에서는 |awk가 특별하다고 간주하지 않는 문자가 뒤에 올 때 백슬래시를 그대로 둡니다.)

awk가 일련의 문자를 내보내도록 하려면 \|문자열 리터럴에서 백슬래시를 보호해야 하므로 ""\|"를 작성합니다.

system("echo \"select * from abc limit 1;\"| impala-shell|grep -Eo \" a-[0-9]-[0-9]* \\| HS[0-9]  \\| [0-9]* \\| [0-9]* \""

관련 정보