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"
}

おすすめ記事