
방금 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 }
대신 작은따옴표를 사용하세요.