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]* \""