awk 인용 프로그램 텍스트

awk 인용 프로그램 텍스트

방금 awk에서 문제를 발견했는데 왜 이런 일이 발생하는지 설명할 수 있는 사람이 있는지 알고 싶습니다.

실행하면 다음 두 줄이 다르게 동작합니다.

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" '{print $1}'

(예상대로) BASE_DIR이 포함된 파일 경로의 첫 번째 디렉터리만 얻습니다.

그러나 다음과 같이 실행하면:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F="/" "{print $1}"

편집하다:

-F="/"그리고 -F "/"내 테스트에 변화를 가져오지 마세요. 두 번째 명령은 이를 표시하도록 업데이트되었습니다.

답변에 대해 glenn jackman이 제안한 대로 명령을 다음과 같이 변경했습니다.

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"

똑같은 결함이 있는 결과를 얻었습니다.

편집 끝

BASE_DIR이 포함된 파일의 전체 경로를 얻었고, "{print \$1}"이것이 문제인 경우를 대비해 프로그램 텍스트를 이스케이프 처리해 보았지만 동일한 결과를 얻었습니다.

여기에 문제가 무엇인지 알려줄 수 있는 사람이 있나요?

답변1

첫 번째 예에서는 다음을 수행합니다. awk -F "/"
다음 예에서는 다음을 수행합니다.awk -F="/"

따라서 필드 구분 기호가 다릅니다. 두 문자열을 =/필드 구분 기호로 사용하고 있습니다.


아, 왜 이전에 이걸 보지 못했는지 모르겠습니다. 잘못된 따옴표를 사용하고 계십니다.

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
------------------------------------------------------^

awk 프로그램 주위의 큰따옴표는 쉘이 변수를 대체한다는 것을 의미합니다.$1 ~ 전에프로그램을 awk에 전달합니다. 쉘에서는 $1비어 있을 가능성이 높으므로 awk는 다음을 확인합니다.{print }

대신 작은따옴표를 사용하세요.

관련 정보