2017-11-02 16 views
0

私は、次の形式でフィールドを処理するために正規表現を使用しています:正規表現と同じ行に一致する複数の文字列

52.200.238.131 - - [31/Jan/2017:10:30:21 +0000] "POST /v1/articles?key=sEahu58asdasd 

私は正規表現を使用してちょうど日付とキーを抽出したいです。私の試みは以下の通りです:

cat Downloads/testlog.log | grep -oE '\[[0-9]{2}/[A-Za-z0-9]{3}/[0-9]{4}|key=[A-Za-z0-9]+' 

私の出力は、2本の異なるライン上の2つのマッチした文字列出力します。私は、彼らが同じ行に印刷するように取得できますか

key=sEahu58nYBTJa 
[31/Jan/2017 

を?

key=sEahu58nYBTJa [31/Jan/2017 
+2

おそらくsedですか? \ {[0-9] {2}/[A-Za-z0-9] {3}/[0-9] {4})。*(key = [ A-Za-z0-9] +)。*#\ 2 \ 1# ''](https://ideone.com/ebH9Sr) –

+0

または、' | tr -d '\ n "を実行してください。 –

+0

最初のコマンドは、行のすべてを再実行します – Jessica

答えて

3
$ grep -oP '\d{2}/\w{3}/\d{4}|key=\w+' Downloads/testlog.log | paste -d' ' - - 
31/Jan/2017 key=sEahu58asdasd 
+0

ペーストは非常にエレガントです。 ;私は 'paste -d '' --'を使って2行だけを貼り付けます。そのファイルにはおそらく多くの行があり、その出力を1つの巨大な行にしたくないのです。 –

1

ここでは2つの方法を使用できます。

最初のものは(Kenneth L's answer @superuser.comを参照)を追加sedはスペースと改行を置き換えるためにコマンドをパイプ使用することです:

s='52.200.238.131 - - [31/Jan/2017:10:30:21 +0000] "POST /v1/articles?key=sEahu58asdasd' 
echo $s | grep -oE '\[[0-9]{2}/[A-Za-z0-9]{3}/[0-9]{4}|key=[A-Za-z0-9]+' | sed ':a;N;$!ba;s/\n/ /g' 

this online demo

を参照してください最初の試合があるので、しかし、それは[31/Jan/2017 key=sEahu58asdasdを出力[31/Jan/2017

あなたは値が常に存在いることを知っている場合にも、次のsedソリューションを使用することがあります。

sed -E 's#.*(\[[0-9]{2}/[A-Za-z0-9]{3}/[0-9]{4}).*(key=[A-Za-z0-9]+).*#\2 \1#' 

another online demo

ポイントが一致し、必要な部分をキャプチャし、ちょうど一致することです参照してください。取り除く必要があるもの、および対応する取り込みグループで取り込まれた値を参照する、置換バックリファレンス、\2および\1で置き換えます。

関連する問題