2017-09-05 9 views
1

2つの文字列間のsedパターンの一致を使用してファイルを解析し、最初の一致を検索しようとしています。反復的に、2つの文字列の間のsedのパターンマッチは、私が最初の一致を得るために探しています、すべての一致を印刷しますsed 2つの文字列間のパターンマッチングは、最初の一致のみを表示します

ファイル:

},{ 
    "prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
    },{ 
    "prefix" : "CS", 
    "prefix" : "AE", 
    "last" : 1, 
    "last" : 0, 
    "month" : 130, 
    "month" : 0, 
    "today": 0, 
    "today": 20, 
    "yesterday": 0, 
    "yesterday": 38, 
    "agents": 0 
    },{ 
    "prefix" : "AF", 
    "prefix" : "CZ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 6, 

私は接頭辞とエージェントの間で抽出しようとしているが、唯一の最初のです次のsedコマンドを使用して一致させてください:

sed -n '/prefix/,/agents/p' /var/saas/stats/usage_1499245200.json.2 >> /var/saas/stats/try 

最初の反復中にファイルから最初の一致を抽出する方法はありますか?usage_1499245200.json.2とループを実行します。

おかげで、 Sriram.V

+0

? – RomanPerekhrest

+0

なぜpythonタグがもう一度ですか?これはPythonとは関係ありません。これは有効なJSONでさえも、キーは重複しています。 –

答えて

1

あなたはagentsに遭遇したときに終了するコマンドを追加することができます。

sed -n -e '/prefix/,/agents/p' -e '/agents/q' 

結果:

awkを使用して
"prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
+0

大変ありがとうございます。このファイルを読むたびに、私はループの下で一連のアクションを実行しています。これらのアクションを実行した後、同じパターンマッチに基づいて、 -e '/ prefix /、/ agents/d' -e '/ agents/q' /var/saas/stats/usage_1499245200.json.2、これは-nのために出力を抑制します。最初のものと一致するものだけを削除しますが、-iを使うべきですか? – sriram2207

+0

'-i'は現在のファイルだけを上書きします。それはまったく新しい質問のように見えます。私はあなたが別の質問をすることをお勧めします(それは問題ではなく、あなたはそれを1つにリンクすることもできます) –

2

[[email protected] test]$ awk '/prefix/{found=1}found;/agents/{exit}' infile 
    "prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
を(ループを含む)、最終結果がどうあるべきか10

入力

[[email protected] test]$ cat infile 
},{ 
    "prefix" : "AD", 
    "prefix" : "CQ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 0, 
    "month" : 5, 
    "today": 0, 
    "today": 0, 
    "yesterday": 2, 
    "yesterday": 0, 
    "agents": 0 
    },{ 
    "prefix" : "CS", 
    "prefix" : "AE", 
    "last" : 1, 
    "last" : 0, 
    "month" : 130, 
    "month" : 0, 
    "today": 0, 
    "today": 20, 
    "yesterday": 0, 
    "yesterday": 38, 
    "agents": 0 
    },{ 
    "prefix" : "AF", 
    "prefix" : "CZ", 
    "last" : 0, 
    "last" : 0, 
    "month" : 6, 
+0

thtaは同等のawkバージョンです、awkはタグに入っています。 –

+0

このファイルを読むたびに、毎回ループの下で一連のアクションを実行しています。これらのアクションを実行した後、私は同じパターンマッチに基づいて行を削除しています。sed - -e '/ prefix /、/ agents/d' -e '/ agents/q' /var/saas/stats/usage_1499245200.json.2、これは-nのために出力を抑制します。最初のものと一致するものだけを削除しますが、-iを使うべきですか? – sriram2207

+0

@ sriram2207、もしあなたが 'gawk'を持っていれば' gawk -i inplace -v INPLACE_SUFFIX = .bak'を使ってください。そうでなければ 'awk '{}' infile> tmpfile && mv tmpfile infile' –

関連する問題