awk의 작은따옴표

awk의 작은따옴표

누군가 아래 명령으로 무슨 일이 일어나고 있는지 설명할 수 있습니까 awk? 오류가 없으면 notme인쇄되지 않는 이유는 무엇이며 구문 오류가 발생하지 않는 이유는 무엇입니까? 닫는 괄호의 경우 ...}따옴표로 닫아야 합니까 ...}'?

$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme

그런 다음 이것을 시도해 보겠습니다.

$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018

또는

awk '{print '"\"$(date)\""} <<<"run"
Wed Apr 11 16:56:38 DST 2018

결과적으로 이는 쉘 명령 대체를 사용하여 모든 작업을 수행할 수 있음을 의미합니다.

이것은 버그입니까? 아니면 제가 찾을 수 없는 특별한 상태일 수도 있습니다.

답변1

처음으로

$ awk '{print "me "$0 '"notme"} <<<"printme"

여기서 일어나는 일은 다음과 같습니다.

  1. 작은따옴표로 묶인 부분은 awk그대로 전달됩니다.
  2. 다음 부분은 "notme"}쉘에 의해 구문 분석된 후 awk결과 문자열로 전달됩니다.notme}
  3. awk당신은 이것을 볼 수 있습니다 :

    {print "me "$0 notme}
    

    awk변수 에는 값이 없으므로 notme다음과 같은 결과를 얻습니다.

두 번째로

$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018

awk나는 값을 전달하기 위해 변수를 사용하여 다음과 같이 작성하는 것을 선호합니다 $(date).

awk -v date="$(date)" '{print "me "$0 date}' <<<"printme-at "
me printme-at Wed Apr 11 13:43:31 BST 2018

귀하의 버전에 구문 오류가 없는 이유를 문의하셨습니다. 그것을 분석해 봅시다:

# typed at the shell
awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "

# prepared for awk
awk '{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}' <<<"printme-at "

# seen by awk
{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}

큰따옴표로 묶인 문자열은 근처에 도달 "\"$(date)\""하기 전에 쉘에 의해 구문 분석되고 리터럴 문자열 (큰따옴표 포함) awk처럼 (쉘에 의해) 평가됩니다 . "Wed Apr 11 13:43:31 BST 2018"당신이 쓴 내용이 유효하기 때문에 문법 오류가 필요한 이유를 모르겠습니다. 비록 읽기에는 약간 복잡하지만.

답변2

awk작은따옴표는 셸에서 프로그램을 구분하는 문자열을 종료합니다. awk그 자체로는 결코 볼 수 없습니다. 그런 다음 프로그램의 초기 부분을 명령 대체를 통해 제공되는 추가 문자열 및 셸의 정적 문자열과 연결할 수 있습니다. 이 모든 일은 awk통화 전에 발생합니다.

물론 명령 대체를 사용하여 나중에 코드로 읽혀지는 문자열을 수정할 수 있지만 awk실제로는 코드를 쉽게 읽을 수 없으며 셸의 인용 규칙, 토큰화 등에 상당히 취약할 수 있습니다.

awk일반적인 방법으로 변수를 설정 하는 것이 좋습니다 .

awk -v thedate="$(date)" '{ print $0, thedate }'  <<<"something"

관련 정보