jq 오류, 파이핑 시 사용법 메시지

jq 오류, 파이핑 시 사용법 메시지

나는 이것의 이름을 무엇으로 지정해야 할지조차 모릅니다. 따라서 jqjson 객체에 사용하면 오류가 발생합니다. cat해당 객체를 사용하면 jqjson이 좋은 형식으로 출력됩니다. 그러나 리디렉션하거나, 다른 것으로 전달하거나, 변수로 가져오려는 등의 작업을 수행하면 사용법 텍스트가 뱉어집니다.

da@nu:~$ jq dada1.json
jq: error: dada1/0 is not defined at <top-level>, line 1:
dada1.json
jq: 1 compile error
da@nu:~$ cat dada1.json|jq
{
  "output": somethingsomething
}
da@nu:~$ cat dada1.json |jq |head
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....
da@nu:~$ da1=$(cat dada1.json |jq)
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
...
da@nu:~$ cat dada1.json |jq > dada2.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....
da@nu:~$ cat dada1.json |jq 2> dada2.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....
da@nu:~$ cat dada1.json |jq |tee -a dada2.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....

왜 이런 일이 발생하는지 모르겠습니다. // 그리고 제가 설정한 변수는 비어 있고 아무것도 리디렉션되지 않습니다.dada2.txt

편집: 수정이나 설명은 아니지만 이렇게 하면 이 문제를 피할 수 있고 jq '.' dada1.json거기에서 출력을 조작할 수 있습니다.

답변1

진짜 @glenn-jackman 님의 댓글이 정답입니다첫 번째 예를 들어, 그러나 나는 이것이 당신이 이것을 할 때 왜 작동하는지에 대한 질문으로 이어질 것이라고 확신합니다 cat. 그리고... 그것은 작동합니다! 기술적으로 이것은 별도의 질문이지만 솔직히 그것은 설명의 논리적 부분입니다.IMHO, 초기 시도가 실패했습니다.

그리고 공평하게 말하면, 나는 댓글에 있는 다른 모든 사람들과 마찬가지로 그것을 무시했다는 사실을 깨닫기 전에 이 답변의 대부분을 썼습니다 cat dada1.json | jq | head. 외. 실패하다.

첫 번째 예에 대한 답변부터 시작하겠습니다.

as를 호출하면 @glenn-jackman이 주석에서 지적한 대로 jq dada1.json플래그가 아닌 첫 번째 인수( a로 시작하지 않음 )가 필터로 구문 분석됩니다. 파일 이름을 필터로 생각하십시오. 이는 주석에 언급된 매뉴얼 페이지의 요약을 보면 분명해집니다.-jq

예, 아시다시피 이 경우 올바른 호출은 jq '.' dada1.json먼저 필터를 구문 분석한 다음 명령줄 끝에 선택적 파일 이름을 구문 분석하도록 하는 것입니다.

그렇다면 이를 사용 cat하면(즉, 파이프로 연결하면) 어떻게 될까요 ? 내가 아는 한 이것은 실제로아니요help/man에 문서화되어 있지만 이 jq코드는 트릭을 수행합니다.

 if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
    program = ".";

내가 아는 한, 기본 "프로그램"(예: "필터")은 다음과 같은 경우에 할당됩니다.

  • 기존 필터가 매개변수 목록에서 구문 분석되지 않았습니다.
  • STDIN 또는 STDOUT은 파이프입니다.

따라서 기본적으로 | jq.

나머지 예시에서는 리디렉션할 수 있습니다.산출jq실패했습니다. 이것은 버전 1.6(및 그 이상) 에서 저(그리고 댓글의 다른 사람들)에게 효과적입니다 . 이전 버전에는질문리디렉션 사용(댓글의 @fra-san에게 감사드립니다). 이전 버전을 실행하고 계신 것 같습니다.

예를 들어 1.6의 경우:

> cat dada1.json | jq | head
{
  "output": "somethingsomething"
}
> cat dada1.json |jq > dada2.txt
> cat dada2.txt
{
  "output": "somethingsomething"
}
> rm dada2.txt
> cat dada1.json |jq |tee -a dada2.txt
{
  "output": "somethingsomething"
}
> cat dada2.txt
{
  "output": "somethingsomething"
}

관련 정보