🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Q&A

2回答

2210閲覧

シェルスクリプトのJSONと判定分について

takeshi1907

総合スコア54

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

0グッド

0クリップ

投稿2021/02/25 02:49

編集2021/02/25 03:01

シェルスクリプトの勉強を初めたばかりの素人です。
ご質問なのですが、下記の様なtest.logファイルがあります。
このlogファイルに書かれている JSON の部分から、token の値が空か判定するスクリプトを作りたいと思っています。

この場合、どのような書き方をすればよろしいでしょうか。

$ cat test.log | jq .token の様なものを使用すれば良いということは調べて分かったのですが、具体的にどのように書いたら良いかがわかりません。

test.log

1// test.log 2 3* Connection state changed (MAX_CONCURRENT_STREAMS == xxx)! 4} [96 bytes data] 5* We are completely uploaded 6< HTTP/2 200 7< date: Wed, 24 Feb 20xx 08:xx:xx GMT 8< content-type: application/json 9< 10{ [2999 bytes data] 11 12100 24xx 0 23xx xxx xx 54xx xxx --:--:-- --:--:-- --:--:-- 56xx 13100 24xx 0 23xx xxx xx 54xx xxx --:--:-- --:--:-- --:--:-- 56xx 14--以下省略-- 15 16 17* Connection #0 to host xxxxx left intact 18{ 19"token":"xxxxxxxxxxxxxxxxxxxxxxxx", 20"user":{"id":"xxxxx","email":"xxxxxx","name":"xxxx"} 21}

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/02/25 05:59

tokenの掛かれている箇所がその一カ所しかないならわざわざjq使わないでgrep|egrepの結果を見るだけで良いと思うが
takeshi1907

2021/02/25 06:41

どうもありがとうございます。コマンド全般初心者の為、よろしければ具体的なコードをいただけると大変助かります。
hentaiman

2021/02/25 06:50

いいけど、検査対象のファイル内にtokenの記載はひとつのみですか?grepでやるにはそれが前提条件になります。複数あるならgrepでやるという方法自体が無意味なので 質問文からは実際にどういう条件の元捜査したいのかが分からないですが、 上記以外にもtokenと書いてある箇所が他には無い事とか、json部分のtokenの記述と被る紛らわしい記述がログ内に無いかなど、色々と条件があります コマンドを作る為にはまずは抽出条件を質問者自身が文章にして他人に説明出来る状態になる必要があります
takeshi1907

2021/02/25 07:00 編集

ありがとうございます。 test.logの中には、上の質問で書いたような情報が含まれています。 また、test.logの中には"〇〇〇token"という文字列が他に1つだけありましたが、 "{"token"" という文字列は json の中に一つしかありません。 目的は jsonの中のtokenというキーの値がある場合はOKない場合はNGとして処理をしたいと言う事になります。 よろしくお願いいたします。
dodox86

2021/02/26 03:53 編集

「シェルスクリプトの勉強」と言いつつ「どう書いたらよいか」を全て求めているので、現時点でいただいている回答とかみ合っていない感がありますね。(ちなみに私は低評価をしていません)
takeshi1907

2021/02/26 05:35

そのつもりはないのですが、そのように思ってしまうのでしたらすみません。。
guest

回答2

0

概ねこういう手順で行います。

まず、ログファイルのなかから、何を基準にすれば、一意に間違いなく該当のJSON部分を抽出できるかを全体をよく見て考えます。

次にそれを、sed awk grep等のコマンド、あるいは何らかのプログラミング言語で実装します。

その出力をjq .tokenに渡します。

あるいは、jqの出力の判定の仕方がわからないというのが質問ポイントなら、jqの出力が""かどうかは、

sh

1TOKEN=`何からのコマンド | jq .token` 2if [ "$TOKEN" = '""' ] 3then echo 空だった 4else echo 空でなかった 5fi

です。

投稿2021/02/25 03:46

編集2021/02/25 03:54
otn

総合スコア85888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeshi1907

2021/02/25 06:46 編集

どうもありがとうございます。とても参考になります。 現在「何からのコマンド」の部分をgrepで試しているのですが、grepを使ってjsonだけを抜き取る方法が分からず、てこずっている状況です。。 書き方としては以下のような形であっていますでしょうか。 TOKEN= grep `token: . *, filename | jq .token`
otn

2021/02/25 13:26

それは、JSONガン無視の方法ですね。 行単位のチェックでいいなら、 if grep '"token":"",' filename >/dev/null then echo tokenが空だった else echo tokenが空でnかった fi でいいです。
takeshi1907

2021/02/26 01:51

どうも、ありがとうございます。 実際のものは改行が入っていないパターンがあり、行数での判断が厳しかったので、TOKEN=`grep 'token":"' $TESTFILE | jq -r .token`の方でやらせていただきました。
otn

2021/02/26 03:38

> 実際のものは改行が入っていないパターンがあり、行数での判断が厳しかったので は、私の回答と何か関係があるのでしょうか? > grep 'token":"' $TESTFILE の結果がJSONでないのは認識していますか?
takeshi1907

2021/02/26 05:34

質問内容だと"token":"xxxxxxxxxxxxxxxxxxxxxxxx", の後に改行が入っていますが、入っていないパターンもあるので、grep '"token":"",'だとその行が全て取得できてしまうのかと思い「改行が入っていないパターンがあり」と書かせていただきました。 >の結果がJSONでないのは認識していますか? jsonと同じ形式の文字列ということでしょうか? 取り急ぎ、下記で動作確認をした所目的通りに動いたので、一旦そちらでやらせていただきました。 TOKEN=`grep 'token":"' $TMPFILE | jq -r .token` echo $TOKEN
guest

0

コメントにあった条件の場合

ソースがこれ

bash

1[root@82dd813ea0f2 data]# cat srouce.log 2* Connection state changed (MAX_CONCURRENT_STREAMS == xxx)! 3} [96 bytes data] 4* We are completely uploaded 5< HTTP/2 200 6< date: Wed, 24 Feb 20xx 08:xx:xx GMT 7< content-type: application/json 8< 9{ [2999 bytes data] 10 11100 24xx 0 23xx xxx xx 54xx xxx --:--:-- --:--:-- --:--:-- 56xx 12100 24xx 0 23xx xxx xx 54xx xxx --:--:-- --:--:-- --:--:-- 56xx 13--以下省略-- 14 15 16* Connection #0 to host xxxxx left intact 17{ 18"token":"xxxxxxxxxxxxxxxxxxxxxxxx", 19"user":{"id":"xxxxx","email":"xxxxxx","name":"xxxx"} 20}

grepすると

bash

1[root@82dd813ea0f2 data]# egrep '"token":".+"' srouce.log 2"token":"xxxxxxxxxxxxxxxxxxxxxxxx",

がヒットする事が分かるのでこの行数を出す

bash

1[root@82dd813ea0f2 data]# egrep '"token":".+"' srouce.log |wc -l 21

実際にスクリプトで使う為に下記のように変数に入れて1か1じゃないかで判定するなどして使用

[root@82dd813ea0f2 data]# RESULT=`egrep '"token":".+"' srouce.log |wc -l` [root@82dd813ea0f2 data]# echo $RESULT 1

投稿2021/02/25 07:34

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeshi1907

2021/02/25 09:43

どうもありがとうございます。参考になりました。 また、大変申し訳ないのですが、実際のものは改行が入っていないパターンがあり、行数での判断が厳しかったので、TOKEN=`grep 'token":"' $TESTFILE | jq -r .token`の方でやらせていただきました。 色々とありがとうございました。
hentaiman

2021/02/25 12:56

だから条件の洗い出しを先にと回答前に聞いたんです。 条件確認した上で回答したものが無駄になって嫌な気分です。回答の為の質問には丁寧に対応してください。
takeshi1907

2021/02/26 01:49

条件に漏れがありすみませんでした。 ただ、このようなやり方があるととても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問