xargs 및 파이프를 사용하여 표준 출력을 여러 단어를 허용하지 않는 원시 데이터로 변환

xargs 및 파이프를 사용하여 표준 출력을 여러 단어를 허용하지 않는 원시 데이터로 변환

현재 명령을 실행 중입니다. echo "hello world" | xargs curl http://localhost:8080/function/func_wordcount -d"표준 출력을 가져온 echo "hello world"다음 옵션을 func_wordcount사용 하도록 파이프합니다 -d. 이 -d옵션은 원시 데이터를 보내는 데 사용되며, my는 func_wordcount원시 데이터 입력을 허용하고 단어 수와 문자 수를 인쇄합니다.

예를 들어, 내가 글을 쓸 때 echo "hello" | xargs curl http://localhost:8080/function/func_wordcount -d"출력은 1, 5입니다. 이는 5개의 문자를 포함하는 단어가 있음을 의미합니다.

하지만 많은 단어를 포함하려고 하면 오류가 발생합니다. 글을 쓸 때 echo "hello world" | xargs curl http://localhost:8080/function/func_wordcount -d"출력 1, 5가 나온 다음 오류가 있는 개행 문자가 표시됩니다 curl: (6) could not resolve host: world. 따라서 해당 옵션을 사용하여 stdout을 원시 데이터로 변환하면 hello world가 두 단어로 분할된다고 확신합니다 -d.

또한 함수가 파이프와 변환 없이 작동한다는 것을 보여주기 위해 함수를 실행하면 curl http://localhost:8080/function/func_wordcount -d "hello world"2, 11이 표시되어 단어 2개와 문자 11개가 있음을 보여줍니다.

내 질문은 이 분할 문제를 해결하는 방법입니다. 내가 혼란스러워하는 부분은 입력의 전반부만 구문 분석하여 완료한 다음 데이터 덩어리를 보내는 대신 두 번째 부분에서 오류를 발생시키는 이유입니다. 공백으로 전혀 구분되지 않은 입력만 보낼 수 있으므로 기능 사용이 매우 제한됩니다.

답변1

그게 다야 xargs. 표준 입력에서 단어 목록(공백 또는 줄 바꿈으로 구분되며 일부 형식의 인용도 이해함)을 받아들이고 전달합니다.그들을실행되는 명령에 대한 인수로.

hello word여기에서 매개변수로 전달 하려면 curl다음이 필요합니다.

echo '"hello world"' | xargs curl...

여기서 이는 공백 사이의 공백이 매개변수 구분 기호로 처리되는 것을 xargs방지하기 위한 인용 메커니즘으로 이해됩니다 . "..."또한 (POSIX 셸과 다른 방식으로) 이해합니다.helloworldxargs\'...'

GNU를 사용하면 xargs구분 기호를 지정할 수도 있습니다. 예를 들어:

echo hello world | xargs -d '\n' curl...

줄 바꿈만 구분 기호(공백 아님)로 인식되며 인용 메커니즘은 비활성화됩니다.

이를 통해 각 단어가 아닌 각 줄의 내용을 명령에 대한 인수로 전달할 수 있습니다.

-dGNU 외부에서는 거의 지원되지 않지만 xargsNUL 을 -0구분하고 인용 처리를 비활성화하는 또 다른 확장이 더 광범위하게 지원됩니다. 따라서 다음과 같이 할 수도 있습니다.

echo hello world | tr '\n' '\0' | xargs -0 curl...

여러 줄의 입력이 있는 경우 xargs모든 줄은 별도의 인수로 전달됩니다 . 각 줄마다 하나씩 호출 curl하려면 옵션을 추가할 수 있습니다.curl-n 1

다음을 사용할 수도 있습니다.

echo hello world | xargs -I@@ curl... @@

이는 curl각 줄마다 하나씩 호출되지만 선행 공백이 제거되고 xargs일부 인용이 여전히 수행되므로 임의의 데이터는 피해야 합니다.

답변2

~에서GNU xargs 매뉴얼 페이지:

xargs표준 입력, 구분 기호에서 항목 읽기공백(큰따옴표, 작은따옴표 또는 백슬래시로 보호할 수 있음)또는 개행 문자, 초기 인수를 사용하여 명령을 한 번 이상 실행한 다음 표준 입력에서 읽은 항목을 실행합니다.

즉, 기본 동작은 입력의 모든 공백이 구분 기호 역할을 하므로 hello world실제로 두 개의 인수가 생성된다는 것입니다.

xargs가 전체 행을 그대로 유지하려면 `xargs -d '\n'을 사용하십시오(GNU xargs에서는 다른 것을 기억할 수 없습니다).

그러나 여러 인수가 주어지면 여전히 여러 줄의 입력이 발생합니다 curl. 이를 방지하고 curl각 입력 라인에 대해 명령을 한 번 실행하려면 를 사용하십시오 xargs -d '\n' -n 1.

입력에 한 줄만 포함된 경우 파이핑 대신 명령 대체를 사용할 수 있습니다.

curl http://... -d "$(echo "hello world")"

관련 정보