이 xargs 명령에 어떤 문제가 있습니까?

이 xargs 명령에 어떤 문제가 있습니까?

나는 다음 두 가지 변형을 시도하고 있습니다.

cat /var/log/zwave.log | xargs -n1 jq '.' 

&:

</var/log/zwave.log xargs -n1 jq '.' 

두 명령이 모두 실행되는 것처럼 보이지만 해당 줄을 파일 위치로 열려고 합니다. 이것은 내가 나열한 두 번째 명령에 대해서는 의미가 있지만 파이프를 사용하는 첫 번째 명령의 경우 각 줄이 파이프 zwave.log로 연결된 것처럼 동작해야 하지 않습니까 jq '.'?


제가 작업하고 있지만 생성을 제어할 수 없는 로깅 시스템은 로그 파일의 각 줄에 json 객체를 생성합니다.

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12189.20, "level": 20, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-04T00:20:30.953Z", "v": 0 }

그러나 로거는 때때로 실패하고 이와 같은 결과를 생성합니다 Unable to start service: [TimeoutError: operation timed out].

그렇기 때문에 jq파일에만 사용할 수 없습니다.

답변1

xargs를 사용하지 마십시오.

jq '.' /var/log/zwave.log

json 줄만 필터링해야 한다면 앞에 grep을 사용할 수 있습니다.

grep -E "^{" test.txt | jq '.' 

Xargs는 입력의 각 단어를 주어진 명령에 인수로 추가하는 데 사용되며 -n 1기본적으로 다음을 실행하는 것과 같습니다.

jq '.' "$word1"
jq '.' "$word2"
jq '.' "$word3"

이것이 당신이 보는 것입니다. 파일에 명령에 전달할 다른 파일이나 인수 목록이 포함되어 있는 경우 xargs를 사용해야 합니다.


xargs¹는 공백으로 구분된 단어(로케일 및 구현에 따라 최소한 공백, 탭 및 줄 바꿈, YMMV xargs) 를 나타내지 xargs만 최신 셸 또는 JSON 파일 형식과 동일한 방식은 아니지만 일부 형식의 인용도 이해합니다.

답변2

파일이 실제로 한 줄씩 json인 경우 jq에서는 사소한 일입니다.

jq에는 이에 대한 지원이 내장되어 있습니다.-s

cat my_file | grep -E "^{" test.txt | jq -sre '.'

이것은 모든 json을 jq의 1개 배열로 연결하므로 이를 염두에 두어야 하지만 수행할 수 있는 아이디어를 제공합니다.

cat my_file | grep -E "^{" test.txt |jq -sre '.[].name'

이것은 당신의 모든 이름을 덤프합니다

관련 정보