列の使用 - awkとsed

列の使用 - awkとsed

スイッチからいくつかの情報を抽出するexpecスクリプトによって生成されたテキストファイルを解析しようとしています。

以下はサンプル出力です。

192      0000.0000.0000        1/g23      Dynamic              
192      0000.0000.0000        ch1        Dynamic              
192      0000.0000.0000        ch1        Dynamic              
192      0000.0000.0000        ch1        Dynamic

そのテキストファイルには、私が興味のない他のジャンクファイルがたくさんあります。上記の例では、スイッチ番号とポート(「1 / g23」)を含む行のみが必要です。

"/ g"パターンを含む行を抽出するためにファイルに対してgrepを実行しましたが、正しく機能しました。

今私が望むのは、2つの列だけです。私はawkを使って列を印刷します。

0000.0000.0000 1/g23

もう終わったので「。」に乗りたい。 sedはこれでうまく動作します

000000000000 1/g23

ここでは、最初の列をMACアドレス形式に変換したいと思います。

So this
000000000000 1/g23
Becomes this
00:00:00:00:00:00 1/g23

これを行うsedコマンドが見つかりました。しかし、私の問題は、最初の列でこれを行うだけです。 MACとポート間の接続を失うことなく、1つの列だけを編集する方法がわかりません。

grep -e "/g" switch6output | awk '{print $2,$3}' | sed 's/\.//g' | sed 's/../&:/g;s/:$//'

私はこれが非常に愚かなアプローチであると確信していますが、これが私が思いつくための最善の方法です。 MACとポートの接続を失うことなく必要な作業を実行するためのより信頼性の高い方法はありますか?

ありがとうございます。

答え1

単にawkを直接使用してください:

awk '/\/g/ {
        gsub(/\./, "", $2)
        gsub(/../, "&:", $2)
        sub(/:$/, "", $2) 
        print $2,$3
}'

このソリューションを使用するgrepsed

答え2

sed:

sed -r '\=1/g23=!d;
        s/[^ ]* *//;
        s/ *[^ ]* *$//;
        s/(..)\.(..)/:\1:\2:/g;
        s/::/:/'

入力にスペースの代わりにタブが含まれている場合は、式を調整する必要があります。

関連情報