AWK로 행 (줄)을 빼는 방법


9

AWK 를 사용 하여 선을 빼는 방법을 알아 내려고합니다 . 예를 들어, 입력 파일이 다음과 같다고 가정하십시오.

30
20

결과는 다음과 같습니다.

10

이제 테스트로 "사용 된"메모리 열을 계산하려고합니다.

$ cat /proc/meminfo

그래서 지금 나는 이것을 썼습니다 :

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    -- Here comes the calculation using AWK

나는 다음을 시도했다.

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}' 

그러나 이것은 단지 마지막 데이터 행을 제공합니다.

작동하는 솔루션을 찾았지만 가장 적합한 솔루션은 아닌 것 같습니다. 모든 코딩 경험에 따르면 행의 양을 하드 코딩하는 것이 끔찍하다는 것을 알 수 있습니다.

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'

N 개의 행으로 무엇을 하시겠습니까? 최종 결과는 line1_$2 - line2_$2 - lineN-$2? 처음 두 개의 연속 행만 빼기를 원하십니까?
terdon

답변:


9

또한 사용하여이 작업을 수행 할 수 있습니다 awk, paste그리고 bc. 나는이 접근법이 기억하기 쉽다는 것을 알았습니다. 구문은 awk항상 확인하기 위해 물건을 찾아야합니다.

참고 : 이 방법은 여러 줄의 출력과 경쟁하여 1, 2, 3, 4 등의 숫자를 빼는 이점이 있습니다.

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | paste -sd- - | bc
7513404

세부

위의 방법은 awk빼려는 숫자가 포함 된 열을 선택하는 데 사용 됩니다.

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'
7969084
408432

그런 다음 paste이 두 값을 결합하고 그 사이에 빼기 부호를 추가하는 데 사용합니다.

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- -
7969084-346660

이것을 전달 bc하면 계산이 수행됩니다.

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- - | bc
7513404

@ terdon-감사합니다 당신이 그것을 할 때 편집하고 있었다 8-)
slm

3

순수한 awk 솔루션, 중복 cat 또는 grep 명령이 없습니다.

awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo

awk_FTW가 나를 이길 수 있지만 출력 형식을 지정하는 것이 좋을 수 있습니다.


3

이 시도:

grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.