2016-09-14 6 views
1

grep、cut、sedなどはかなり使い慣れていますが、このデータをファイルから抽出するのは難しい作業です。それは次のようになります。私は、文字列-----|後に何かを持っているすべての行を返したい 文字列の後に行が一致した場合は、コマンドを実行してください

--timestamp-- data://example1// -----| This could be anything or nothing 
--timestamp-- data://example2// -----|  This could be something 
--timestamp-- data://example3// -----| 
--timestamp-- data://example4// -----|  This could something else 
--timestamp-- data://example5// -----| This could be another something 
--timestamp-- data://example6// -----| 
--timestamp-- data://example7// -----|  This could something else 

ので、出力は次のようになります。私はベースのIFステートメントを使用する必要があることを知っている

example1 
example2 
example4 
example5 
example7 

grep '-----|.*$'と一致しています文字列の後に文字がある場合は、その行を出力します。次に、例の前後のデリミタ//の間で抽出するawkコマンドにパイプすることができました。 if文をどのように構造化するかについてはまったく問題があります。

このIFステートメントのヘルプは非常に高く評価されます。

+0

'if'を必要とせず、grep(または2つ)で十分です。 – redneb

+0

「後にあるすべての行」は、「後にない行」を意味しましたか? – redneb

+0

申し訳ありませんが、質問を更新しました。私は間違いなく後に何かをしたい。 – DomainsFeatured

答えて

1

あなたは、フィールドセパレータとして//を使用して、これを行うと、第二フィールドを印刷するawkのを使用することができます。

awk -F'//' '/-{5}\|[ \t]*[^ \t]/{print $2}' file 

example1 
example2 
example4 
example5 
example7 

正規表現:0以上の空白が続くリテラルのパイプが続いた後、破線5用/-{5}\|[ \t]*[^ \t]/検索を非空白文字。後のスペースがあなたの例のデータでは

awk -F'//' '/-{5}\|[[:blank:]]*[^[:blank:]]/{print $2}' file 
+1

Hey Anubhava、第2のPOSIXクラスは良く見えます。ちょっと試してみてください。 – DomainsFeatured

+0

'[[:blank:]] *'は '。*'になります。 –

+0

はい、しかしそれはパフォーマンス賢明な '[[:blank:]] *'はバックトラックなしでより良いでしょう。 – anubhava

0

|:

また、スペースまたはタブに合わせて、POSIXクラス[[:blank:]]を使用することができます(または単にコピーのアーティファクト)。それらが実際に存在しない場合は、パターンを/\| .+$/から/\|.+$/に一致するように変更します。スペースを削除します。

これは、 '| 'コンボ:

$ awk -F/ '!/\| .+$/ {print $3}' < t 
example3 
example6 

これは、' | 「コンボ:

$awk -F/ '/\| .+$/ {print $3}' < t 
example1 
example2 
example4 
example5 
example7 
1

私は、単一のgrepでそれを行うだろう:

grep -oP '[^/]*(?=// -----\| .+$)' input.txt 

example1 
example2 
example4 
example5 
example7 

アイデアが/間のテキストから行末までのすべての方法を開始すると一致することです。私は-oフラグを使用して、各行の一致部分だけを返します。これは、内部のパターンと一致する先読み(つまり、(?=...)部分)と組み合わせてうまく機能しますが、一致するテキストは出力に含まれません。あなたは、彼らが存在していなかったかのように|後に空白を扱いたい場合は

1
$ awk -F'/' '!/\|$/{print $3}' file 
example1 
example2 
example4 
example5 
example7 

条件/\|[[:blank:]]*$/してください。このアプローチは、のような行与えられた失敗すること

注:

--timestamp-- data://example1// -----| "anything" includes | 

をそれはそれから起こるあなたの例では、それを含めることができます。

--timestamp-- data://example1// -----| "anything" includes -----| 

ので、まだ障害を引き起こす可能性があります:それはまた、「何でも」としての資格であなたは-----|に一致するように条件を変更することができます。サンプル入力/出力を正確かつ真に代表し、晴れた日だけでなく、最悪の場合のシナリオも含めてください。ここ

+1

ありがとうございます。申し訳ありませんが詳細を提供できませんでした。私が選んだ答えは私のために問題を処理します。私は助けに感謝します。多くの名声。 – DomainsFeatured

+0

もちろん、「何か」が実際に何を意味しているかに依存しない場合もあります。また、「何か」が実際に何を意味しているかによって、はるかに単純な解決策があるかもしれません。 –

0

が、これは余分な区切りケースを扱う別のawk

$ awk -F'-----\\|' '$2~/[^ ]+$/{n=split($1,a,"//"); print a[n-1]}' file 

example1 
example2 
example4 
example5 
example7 

です。

関連する問題