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()
거기에 출력을 파이프하면 네임스페이스와 인터페이스가 포함된 두 줄이 표시됩니다.
grep --only-matching
또는 -o
관심 있는 부분을 제거해 볼 수도 있습니다 .
마지막으로 Bash에서 =~
(또는 ?)를 사용하여 ~=
정규식을 실행한 다음 $BASH_REMATCH
배열을 사용하여 결과를 얻을 수도 있습니다.