다음과 같은 예제 문자열이 있다고 가정해 보겠습니다.
<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>
제 생각에는정제이것첫 번째 숫자 그리고이것지적 재산권다음 형식을 사용하세요.
0 10.0.100.10
sed 's@^[^0-255]*\([0-255]\+\).*@\1@'
첫 번째 ( ) 번호와 IP ( grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
)를 추출하는 방법을 알고 있지만그 당시에는단 한 줄로 달성할 수 있는지 알고 싶습니다.
답변1
모든(정수) 숫자와 모든 IP(v4) 주소가 필요한 경우 grep을 사용하여 정규식에 대체 항목을 추가하세요.
... | grep -oE '[0-9]+|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
이렇게 하면 한 줄에 하나의 값이 인쇄되고 물론 끝 0
부터 캡처됩니다.ETH0
위와 유사한 구조의 숫자와 IP를 포함하는 입력 라인만 필요한 경우(다른 구조는 필요하지 않음), 예를 들어 sed를 사용할 수 있습니다.
... | sed -nEe 's,.*<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>.*,\1 \2,p'
\1
그리고 괄호 안의 첫 번째와 두 번째 그룹에 해당하는 것은 \2
명확성과 게으름을 위해 여기에 IP를 일치시켰습니다.[0-9.]+
또는 Perl에서도 유사합니다:
... | perl -ne 'print "$1 $2\n" if m,<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>,'
답변2
숫자가 아닌("." 아님) 문자를 모두 공백으로 바꾸면 첫 번째와 두 번째 열을 인쇄할 수 있습니다.
echo '<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>' | \
sed -re 's;[^0-9.]; ;g' | \
awk '{print $1,$2}'
산출:
0 10.0.100.10
추신: "."이 있으면 더 복잡하게 만들어야 합니다. IP뿐만 아니라 다른 곳에서도 마찬가지입니다.
답변3
사용 xq
(부터https://kislyuk.github.io/yq/), 입력이 실제로 질문의 단일 XML 노드라고 가정합니다.
xq -r 'to_entries[] | [ (.key|ltrimstr("ETH")|rtrimstr("_IP")), .value ] | @tsv' file.xml
이는 XML 문서를 JSON으로 변환한 다음 태그 이름 ETH
의 시작과 끝을 _IP
제거하여 나머지 태그 이름을 추출합니다 . IP 주소도 추출되어 결과 값 2개가 탭으로 구분된 목록으로 출력됩니다.
ltrimstr()
호출은 rtrimstr()
레이블 이름에서 숫자가 아닌 모든 문자를 제거하는 or로 대체될 수 있습니다.gsub("[^[:digit:]]"; ""))
gsub("\\D"; ""))
중간 JSON 문서는 다음과 같습니다.
{
"ETH0_IP": "10.0.100.10"
}
...최종 출력은 다음과 같습니다.
0 10.0.100.10