우리 서버에서 cronjob은 공유 디렉터리의 파일 수를 기록합니다. 로그 형식은 다음과 같습니다.
2003-07-03T16:05 279
2003-07-03T16:10 283
2003-07-03T16:15 282
지금까지 파일에는 백만 개가 넘는 항목이 있습니다. 나는 지금까지 우리가 경험한 가장 큰 변화(부정적, 긍정적)를 찾는 데 관심이 있습니다. 이를 찾기 위한 프로그램을 작성할 수 있지만 증분 목록을 제공할 수 있는 도구가 있습니까?
원본 파일은 Solaris에 있지만 Linux Mint 시스템에 파일 사본이 있습니다.
답변1
패키지가 있는 경우num-utils
설치 후 다음을 수행할 수 있습니다.
cut -d ' ' -f 2 inputfile | numinterval | sort -u
첫 번째와 마지막 숫자는 각각 최소값을 나타냅니다. 가장 큰 변화.
목록이 너무 길고moreutils
설치 후 다음을 수행할 수 있습니다.
cut -d ' ' -f 2 inputfile | numinterval | sort -u | pee "tail -1" "head -1"
Mint에서는 이러한 패키지를 설치할 수 있어야 하고, Solaris에서는 소스에서 컴파일해야 할 수도 있습니다.
답변2
$ awk 'BEGIN{last=0}{delta[NR]=$2-last; last=$2; print $0" "delta[NR]}' file
당신에게 줄 것이다
2003-07-03T16:05 279 279
2003-07-03T16:10 283 4
2003-07-03T16:15 282 -1
마지막 열에는 증분이 있으므로 가장 큰 열을 찾으려면 파이프를 정렬하면 됩니다.
$ awk 'BEGIN{last=0}{delta[NR]=$2-last; last=$2; print $0" "delta[NR]}' file | sort -k3n
2003-07-03T16:15 282 -1
2003-07-03T16:10 283 4
2003-07-03T16:05 279 279
그러나 수백만 개의 항목에 대해서는 매우 느릴 것입니다. mysql
대신 또는 다른 데이터베이스를 사용할 수도 있습니다 .
답변3
가장 큰 차이가 있는 두 줄을 표시합니다.
awk '{c=$2-a[2];
if(c<0)c=-c;
if(+a[2]&&c>b){b=c;d=a[1]" "a[2]"\n"$0};
split($0,a," ")}
END{print "Difference is",b,"between:\n"d}'