![우분투에서 nawk를 테스트하는 방법은 무엇입니까?](https://linux55.com/image/220406/%EC%9A%B0%EB%B6%84%ED%88%AC%EC%97%90%EC%84%9C%20nawk%EB%A5%BC%20%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 Apple MacO와 Ubuntu 간에 포팅해야 하는 스크립트를 작성 중입니다. 전자의 "awk"는 nawk에서 제공하는 것이고 후자는 gawk에서 제공하는 것입니다. 구현 간에는 상당한 차이가 있습니다.
특히 저는 Ubuntu 22.04LTS에서 개발 중인데 안타깝게도...
# apt install nawk
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package nawk
(Debian Bullseye에서도 동일)
또한 nawk 소스 코드를 다운로드하고 컴파일해 보았으나 내 배포판에서는 yacc를 사용할 수 없으며 Bison은 makefile을 실행할 만큼 호환되지 않습니다.
멍하게 만드는 방법이 있나요성능녹처럼요?
실패하면 저장소에서 정보를 얻을 수 있는 Linux 배포판이 있습니까?
답변1
nawk
예, 저장소에 하나 이상의 릴리스가 있습니다. 나는 많은 것이 있다고 확신하지만 내 Arch 시스템에서 이 글을 쓰고 있으며 Arch가 다음을 가지고 있음을 확인할 수 있습니다 nawk
.
$ pacman -Ss nawk
community/nawk 20220912-1 [installed]
The one, true implementation of AWK
즉, 여기서 유용한 트릭은 busybox 를 사용하는 것입니다 awk
.바쁜 상자다양한 표준 도구의 간소화된 버전을 제공하는 임베디드 시스템에서 매우 유용하고 일반적인 훌륭한 도구입니다.
BusyBox는 많은 일반적인 UNIX 유틸리티의 작은 버전을 작은 실행 파일로 결합합니다. 일반적으로 GNU fileutils, shellutils 등에서 찾을 수 있는 대부분의 유틸리티를 대체합니다. BusyBox의 유틸리티는 일반적으로 전체 기능을 갖춘 GNU 유틸리티보다 옵션이 적습니다. 그러나 포함된 옵션은 예상되는 기능을 제공하고 GNU 유틸리티와 매우 유사하게 작동합니다. BusyBox는 소규모 시스템이나 임베디드 시스템에 대해 매우 완벽한 환경을 제공합니다.
그것이 제공하는 도구 중 하나는 Ubuntu( ) 에 awk
설치하는 경우 최소한의 .busybox
sudo apt install busybox
busybox awk
awk
아니요 nawk
awk
, 그러나 이는 보다 더 나은 성능을 제공해야 하는 단순하고 간단한 버전입니다 gawk
. 스크립트가 busybox에서 작동하는 경우에는 busybox 및 awk
에서도 작동할 가능성이 높습니다 . 이것은 완벽한 해결책이 아닙니다. 나는 찾았습니다.gawk
nawk
코멘트사이트의 또 다른 답변은 "실제로 BusyBox는 v3 awk
와 매우 유사하게 작동합니다 .gawk
nawk
, 그러나 이것은 시작에 불과합니다.
마지막으로 아마도 가장 관련성이 높은 gawk
것은 실제로--posix
옵션:
-피
--posix
엄격한 POSIX 모드에서 실행됩니다. 이는 --traditional과 마찬가지로 모든 gawk 확장을 비활성화하고 POSIX에서 허용하지 않는 모든 확장을 비활성화합니다. 바라보다일반적으로 사용되는 확장 기능 요약이 옵션으로 비활성화된 gawk의 확장 기능 요약입니다. 또한 다음과 같은 추가 제한 사항이 적용됩니다.
'?' 뒤에는 개행 문자나 ":"가 허용되지 않습니다(참조).조건식). 명령줄에 "-Ft"를 지정하면 FS 값이 단일 탭으로 설정되지 않습니다(참조:필드 구분 방법 지정). 로케일의 소수점 문자는 입력 데이터를 구문 분석하는 데 사용됩니다(참조귀하의 위치는 다양합니다).
명령줄에 --traditional과 --posix를 모두 제공하는 경우 --posix가 우선 적용됩니다. gawk는 두 옵션이 모두 제공되면 경고를 발행합니다.
따라서 가장 좋은 방법은 gawk --posix
테스트하는 동안 이식 가능한 기능만 사용되는지 확인하는 것입니다.
아니면 아닐 수도 있습니다.에드 모튼우리 상주 awk 전문가 중 한 명이 현재 삭제된 댓글에서 다음과 같이 말했습니다.
gawk --posix
휴대용 기능만 사용한다는 보장은 없습니다. 예를 들어, 이 옵션 세트를 사용하면 문자열의 모든 문자split("foo",arr,"")
가 채워지지만 다른 awk는 전체 문자열의 개별 항목을 채우 거나 다른 작업을 수행할 수 있으며 빈 문자열을 구분 기호로 사용하는 필드 분할이 허용되지 않기 때문에 POSIX와 호환됩니다. 행동. gawk 확장을 끄는 것이 전부이지만 POSIX에서 정의하지 않은 동작에 대해 gawk 구현에 의존하는 코드를 작성하려면 여전히 수동 관리가 필요합니다. ——에드 모튼arr[]
"foo"
arr[]
"foo"
--posix
Ed는 나보다 awk에 대해 더 많이 알고 있으므로 그의 말을 받아들입니다.
답변2
좀 더 검색한 끝에 nawk의 최신 버전을 찾았습니다(또는 적어도 저는믿다이건 말도 안돼), 도로 표지판은https://www.cs.princeton.edu/~bwk/btl.mirror/index.html존재하다https://github.com/onetrueawk/awk
그래도 누군가 더 나은 제안이 있는지 확인하고 싶습니다.
답변3
이러한 유형의 질문에 대한 대답은 크로스 플랫폼 프로젝트가 필요하다는 것입니다.
프로젝트가 실행되어야 하는 플랫폼에서 프로젝트를 확인하고 필요한 준비를 실행한 다음 테스트 사례 모음을 실행할 수 있어야 합니다.
새 버전의 스크립트를 출시할 때마다 다음 테스트 계획을 실행해야 합니다. 지원되는 모든 플랫폼에서 릴리스 기준을 업데이트하고, 테스트 사례를 실행하고, 모든 것이 제대로 작동하도록 해야 하는 다른 테스트 계획을 실행합니다. 지원되는 모든 플랫폼에 대한 자신감 .
조금만 주의하면 GNU Awk, nawk 등에서 동일한 결과를 생성하는 Awk 코드를 작성할 수 있습니다.
소스 코드를 알아내고 컴파일했지만 내 배포판에서는 yacc를 사용할 수 없고 Bison은 충분히 호환되지 않습니다.
나는 "One True Awk" 프로젝트가 매우 어리석은 일을 한다는 것을 발견했습니다. 정의 이제makefile
문법 파일은 사용자가 설치한 Bison 버전의 기본 동작에 영향을 받습니다. 문제를 더욱 복잡하게 만드는 것은 프로젝트가 관리자가 실제로 구축하고 테스트하는 생성된 파서 소스를 제공하지 않는다는 것입니다. 따라서 다운스트림 사용자는 프로그램의 상당 부분에 대해 다른 C 코드를 실행합니다.YACC = bison -d
awkgram.y
Bison을 설치하는 데 문제가 있는 경우 또는 매개변수가 없으면 Yacc가 아닙니다 bison --yacc -d
.bison
-y
--yacc
실패하면 다른 플랫폼에서 파서를 생성하고 생성된 파일을 사용하십시오.
플랫폼 A에서 nawk를 실행한다고 해서 테스트 없이 코드가 플랫폼 B에서 실행될 것이라고 가정할 수 있다는 의미는 아닙니다.
아무튼 그럴듯하다진짜 이상한소스 코드에는 Yacc에서 생성된 파서가 포함되어 있지 않습니다. 이는 오류입니다. 당신이 할 수 있는 일은 해당 플랫폼에서 Yacc를 실행하고 결과 y.tab.c
와 y.tab.h
파일을 로컬 트리에 추가하는 것입니다. 파일을 다시 작성 awkgram.y
하거나 makefile
조정하려고 시도하지 않도록 타임스탬프를 터치하여 파일이 최신인지 확인하세요 makefile
.
Yacc 프로그램은 다운스트림 사용자가 Yacc를 설치하지 않고도 프로그램을 빌드할 수 있도록 이식 가능한 C 출력을 생성합니다. Yacc 구문을 사용하는 프로젝트는 모든 다운스트림이 동일한 C를 컴파일할 수 있도록 항상 생성된 코드를 게시해야 합니다. 사람들이 동일한 C 소스 코드를 가지고 있지만 다른 시스템과 환경에 맞게 빌드하는 것은 충분히 위험합니다.
awkgram.y
Bison이 Brian Kernighan의 awk 파일을 처리할 수 없다는 사실에 놀랐습니다 . bison --yacc
또는 를 사용해야 합니다 bison -y
. Bison이 Yacc 구현을 제공하는 시스템에는 일반적으로 yacc
인수를 bison -y
또는 에 전달하는 스크립트가 있습니다 bison --yacc
. 방금 https://github.com/onetrueawk/awk.git
Bison 3.0.4가 기본적으로 설치되어 있는 Ubuntu 18 인스턴스를 확인했는데 /usr/local/bin
둘 다 awkgram.y
오류 없이 수락했습니다.