열 사용 - 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을 수행했는데 제대로 작동했습니다.

이제 내가 원하는 것은 가운데 두 개의 열뿐입니다. 나는 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과 포트 간의 연결을 잃지 않고 단 하나의 열만 편집하는 방법을 잘 모르겠습니다.

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
}'

이 솔루션을 사용 grep하면 sed.

답변2

sed:

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

입력에 공백 대신 탭이 포함된 경우 표현식을 조정해야 합니다.

관련 정보