-2

正規表現で行頭のスラッシュとスペースを無視するにはどうすればよいですか?

以下の例では、grep と awk を使用しているため、パイプとスペースを無視する必要があります。

実際のコマンドは私に与えます

コマンド

size=5.0G features='0' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=1 status=active
| `- 3:0:0:3   sdh  8:112   active ready running    #Line 3
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 4:0:0:3   sdl  8:176   active ready running    #Line 5

これを行うことにより:

cmd | grep -E '[0-9]+:[0-9]+:[0-9]+:[0-9]+' | awk '{print $3}'

sdh、sdlを入手できました。しかし問題は、'|' を無視する必要があることです。ライン 3 とライン 5 を同じにします。お知らせ下さい。

編集1 2つの情報を取得する必要があります

1) 番号

3:0:0:3
4:0:0:3

2) ディスク名

sdh
sdl
4

3 に答える 3

1

2 つの行のそれぞれに同じ数のフィールドを持たせるのではなく-o、grep のオプションを使用して、正規表現に一致する行の一部のみを指定します。awkその後、コマンドはまったく必要ありません。

cmd | grep -o -E '[0-9]+:[0-9]+:[0-9]+:[0-9]+'

実際には、元の質問にあったもの以上のものが必要なので:

cmd | grep -E '[0-9]+:[0-9]+:[0-9]+:[0-9]+' | sed 's/^| //' | awk '{print $2, $3}'
于 2012-07-13T14:51:30.627 に答える
1

ですべてを行いawkます:

gawk --re-interval '/[0-9:]{4}/ { sub("\\|", ""); print $2, $3 }'

より正確な正規表現については、以下の @CodeGnome のバージョンを参照してください。

于 2012-07-13T15:24:10.367 に答える
0

おそらく、コマンドを調整して、正規表現マッチャーの扱いを少なくする必要があります。ただし、Perl 互換の正規表現を使用すれば、これを確実に行うことができます。例えば:

$ pcregrep -o '((\d:){3}\d)\s+\S+' << 'EOF'
size=5.0G features='0' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=1 status=active
| `- 3:0:0:3   sdh  8:112   active ready running    #Line 3
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 4:0:0:3   sdl  8:176   active ready running    #Line 5
EOF

3:0:0:3   sdh
4:0:0:3   sdl

その後、IFS、awk、またはその他のメカニズムを使用して 2 つのフィールドを分割してから、スクリプトの次のステップに渡すことができます。

于 2012-07-13T15:23:52.137 に答える