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
使用して結果を取得することもできます。