아래와 같이 전역 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>
gc
XMLstarlet을 사용하여 다음과 같이 속성이 있는 노드에 대한 데이터를 추출할 수 있습니다 :id
82
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
다음으로 설정합니다.FNR
id
<gc type=\"global\"
다음으로 if
플래그를 재설정하고 행에 문자열이 포함되어 있고 1인 경우 배열 키 끝 변수를 설정합니다 e
.FNR
</gc>
f
END
배열의 요소는 키 값이 과 사이인 경우에만 인쇄됩니다 .a
s
e
답변4
'type="global"'이 있는 줄을 grep한 다음 sed를 사용하여 'id=':' 뒤의 따옴표 안에 있는 값을 추출할 수 있습니다.
$ grep 'type="global"' /tmp/foo | sed -e 's/^.*id="\([0-9]*\)".*$/\1/'
80
81
82
...