스위치에서 일부 정보를 추출하는 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/::/:/'
입력에 공백 대신 탭이 포함된 경우 표현식을 조정해야 합니다.