チケット番号のみを印刷するにはどうすればよいですか?

チケット番号のみを印刷するにはどうすればよいですか?

以下はファイルの内容ですが、「[]」に入っているチケット番号だけを出力してください。 sedコマンドとgrepコマンドを使用してこれを実行できるかどうかを知りたいです。

[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN 
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary

出力は次のようになります。

26727777
25709048
26716590
23995808

試してみましたが、sed -e 's/[^0-9]//g' ticket | sed '/^$/d'目的の結果が得られませんでした。行には他の数値も含まれているので、チケット番号を確認するだけです。

226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216

答え1

GNUを使用できますgrep

$ grep -oP '/\K\d+(?=])' ticket 
26727777
25709048
26716590
23995808

またはsed:

sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808

上記の両方が提供された例では機能しますが、実際のファイルで機能するかどうかはファイルの異なる行によって異なります。 a 後のすべての数字/、たとえばgrepa 前のすべての数字を印刷します]。これらの基準に一致する他の行がある場合は、ファイル全体を表示する必要があります。

答え2

個人的に私はPerlを使います。

perl -lne 'print /(\d+)\]/'

これを行う必要があります。

-l"Tangle line break"と言うと、自動的に行から削除され、各print

-n'ループに入れますwhile (<>) {。 STDIN(またはファイル)を1行ずつ繰り返しますgrep

-e引用符で囲まれたコマンドを実行する「式」(または「実行」)。 (そうでない場合は、perlプログラムをお読みくださいSTDIN。)

正規表現の基本一致が$_(この場合は現在行)という事実を使用します。

キャプチャグループを指定したため、「true」または「false」を返すのではなく、キャプチャされた値の(単一要素)リストを返します。

\d+1 つ以上の数値です。 (これは「高度な」正規表現とほぼ同じですが、ラテン語以外の数字を使用している場合は動作が異なります。)その後に1つを追加する必要があります[0-9]+]

そしてなぜ私たちはいいえg正規表現の最後に使用され、1行に1回だけ一致します。

答え3

sed 's/[^0-9]*\([0-9]*\).*/\1/'

ただし、チケット番号の幅が固定されている場合は、使用することをお勧めしますcut

編集:grepを使う: grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'

答え4

tr "\[\]/" " "| awk '/request/ {  print $3 }'

関連情報