bashで文字列を解析するより良い方法は何ですか?

bashで文字列を解析するより良い方法は何ですか?

bashスクリプトを使用して名前空間とインタフェース名を抽出するには、次のコマンドを解析する必要があります。私は通常このタスクを実行するためにIFSを使用しますが、これは私に退屈に見えます。 IFSを設定せずにこれを行うより良い方法はありますか?

    ovsdb-client dump Open_vSwitch  | grep nw-uplink    
    ffff-fff-ffff-ffff-fffffffff [ffff-fff-ffff-ffff-fffffffff] 10      "v1.1"    {id="ffff-fff-ffff-ffff-fffffffff"}     []              10       {timeout1="180", timeout2="3600", type="", connid2-val="", sat-enabled=no, namespace=default, nw-uplink="tap0", platform=kvm, timer="300", dest=localhost, dest-port="514"} "0.0.0-1-priv" []  {}         RedHatEnterpriseServer "6.6-Sanity"

答え1

醜いAwk注文:

 awk 'BEGIN{RS=" "; FS="="} {gsub(/,|"/,"")} /namespace/ {name=$2}; /uplink/ {intf=$2} END {print name": "intf}' <(command)
 default: tap0

答え2

Unixシェルは次のとおりです。コマンドソルバー、より複雑な操作、モーション制御構造、および変数を実行するために数行のコードを簡単に組み合わせるために。彼らいいえプログラミング言語。はい、シェルスクリプトはポータブルで非常に優れており(どのシェルはどこでも利用可能)、Unixパイプと(より重要なことに)システム管理コマンドを組み合わせて利用できるため、どこにでもあります。

より微妙な作業を行うには、Python(ほとんどのLinuxディストリビューションではこれを使用してさまざまなシステム管理GUIを作成するため、ほとんどどこでも利用可能)などのスクリプト言語を使用してください。

答え3

Pythonと正規表現を使用してこれを実行できます。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Copyright © 2016 Martin Ueding <[email protected]>
# Licensed under The MIT License

import sys
import re

def main():
    for line in sys.stdin:
        m1 = re.search(r'namespace=([^,]+)', line)
        if m1:
            print(m1.group(1))
        m2 = re.search(r'nw-uplink=([^,]+)', line)
        if m2:
            print(m2.group(1))


if __name__ == '__main__':
    main()

そこに出力をパイプすると、名前空間とインターフェイスを含む2行が表示されます。

grep --only-matchingまたは、-o興味のある部分を削除してみてください。

最後に、Bashで=~(または?)を使用して~=正規表現を実行し、配列を$BASH_REMATCH使用して結果を取得することもできます。

関連情報