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()

거기에 출력을 파이프하면 네임스페이스와 인터페이스가 포함된 두 줄이 표시됩니다.

grep --only-matching또는 -o관심 있는 부분을 제거해 볼 수도 있습니다 .

마지막으로 Bash에서 =~(또는 ?)를 사용하여 ~=정규식을 실행한 다음 $BASH_REMATCH배열을 사용하여 결과를 얻을 수도 있습니다.

관련 정보