데이터 블록에서 특정 값 추출

데이터 블록에서 특정 값 추출

아래와 같이 전역 ID로 구분된 데이터 덩어리가 있습니다. 아래 예에서는 id 값이 가장 높은 마지막 데이터 덩어리를 추출해야 합니다 id="82".

<gc type="global" id="80" totalid="80" intervalms="315080.595">
---Remaining data---------
 </gc>
 <gc type="global" id="81" totalid="81" intervalms="315080.595">
---Remaining data---------
 </gc>
 <gc type="global" id="82" totalid="82" intervalms="315080.595">
---Remaining data---------
 </gc>

나는 다음을 할 수 있습니다. 그러나 id 값은 두 자리로 제한됩니다. id 값에 숫자 제한을 적용하지 않고 마지막 데이터 덩어리를 어떻게 내보낼 수 있습니까?

data1=`grep "gc type="global"" abc.log| cut -c24-26|tail -n1`

lastdata="gc type="global"=$data1"

sed -n '/'"${lastdata}"'/,$p' abc.log>last_block_data.log

답변1

cut문자 별로 셀 필요는 없습니다 -c. 대신 cut지정된 -d리미터를 사용할 수 있습니다.

grep '^<gc type="global"' <infile | cut -d\" -f4

80
81
82

이는 "행에서 네 번째로 구분된 필드만 가져옵니다. 따라서 필드에는 큰따옴표가 없는 한 원하는 수의 문자(또는 원하는 경우 숫자)가 포함될 수 있습니다.

하지만 전체 라인을 원한다면 그렇게 할 필요는 없습니다.

sed -e'/^<gc type="global"/!{g;/./q;d;}' -e'h;$!d' <infile

답변2

데이터가 아래와 같이 잘 구성되고 구조화된 XML 문서라고 가정합니다.

<?xml version="1.0"?>
<root>
  <gc type="global" id="80" totalid="80" intervalms="315080.595">
---Remaining data---------
 </gc>
  <gc type="global" id="81" totalid="81" intervalms="315080.595">
---Remaining data---------
 </gc>
  <gc type="global" id="82" totalid="82" intervalms="315080.595">
---Remaining data---------
 </gc>
</root>

gcXMLstarlet을 사용하여 다음과 같이 속성이 있는 노드에 대한 데이터를 추출할 수 있습니다 :id82

xmlstarlet sel -t -v '//gc[@id="82"]' file.xml

gc그러면 해당 노드가 문서의 어디에 있든 상관없이 관련 노드의 내용을 가져옵니다 .

답변3

awk -F[=\"] '{
    a[FNR]=$0;
    if ($6>l && $0 ~ "<gc type=\"global\""){
        l=$6;f=1;s=FNR
    };
    if($0 ~ "</gc>" && f==1 ){
        e=FNR;f=0
    }}
    END{ 
    for (i=s;i<=e;i++) {
        print a[i]
}}'

<gc type="global"그러면 가장 큰 ID로 시작하는 블록이 인쇄됩니다 .</gc>

a모든 행은 키가 있는 배열에 저장됩니다.FNR

6번째 필드가 이전 필드보다 크고 행에 문자열이 포함된 경우 첫 번째 필드는 if플래그를 설정 f하고 배열 키 시작 변수를 s다음으로 설정합니다.FNRid<gc type=\"global\"

다음으로 if플래그를 재설정하고 행에 문자열이 포함되어 있고 1인 경우 배열 키 끝 변수를 설정합니다 e.FNR</gc>f

END배열의 요소는 키 값이 과 사이인 경우에만 인쇄됩니다 .ase

답변4

'type="global"'이 있는 줄을 grep한 다음 sed를 사용하여 'id=':' 뒤의 따옴표 안에 있는 값을 추출할 수 있습니다.

$ grep 'type="global"' /tmp/foo | sed -e 's/^.*id="\([0-9]*\)".*$/\1/'
80
81
82
...

관련 정보