AWK ile satırları (satırları) çıkarma


9

Ben hatları çıkarmak için AWK nasıl kullanabilirim anlamaya çalışıyorum . Örneğin, girdi dosyasının:

30
20

Çıktı:

10

Şimdi, bir test olarak "Kullanılmış" bellek sütununu hesaplamak çalışıyorum:

$ cat /proc/meminfo

Şu anda bunu yazdım:

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

Aşağıdakileri denedim:

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

Ama bu bana son veri satırını veriyor.

Çalışan bir çözüm buldum, ancak bunun en uygun çözüm olduğundan şüpheliyim. Tüm kodlama deneyimim, satırların miktarını zor kodlamanın korkunç olduğunu söylüyor: P

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

N satır ile ne yapmak isterdiniz? Nihai sonuç olmalı line1_$2 - line2_$2 - lineN-$2mı? Sadece art arda ilk iki satırı çıkarmak istiyor musunuz?
terdon

Yanıtlar:


9

Ayrıca kullanarak bunu yapabilirsiniz awk, pasteve bc. Bu yaklaşımı hatırlamayı daha kolay buluyorum, sözdizimi awkher zaman onaylamak için bir şeyler aramamı gerektirir.

NOT: Bu yaklaşımın avantajı, birden çok çıktı çizgisine karşı çıkabilme, 2., 3., 4. vb. Sayıları 1. sayıdan çıkarabilmesidir.

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

ayrıntılar

Yukarıdakiler, awkçıkarmak istediğimiz sayıları içeren sütunu seçmek için kullanır .

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

Daha sonra pastebu 2 değer değerlerini birleştirmek ve aralarına eksi işareti eklemek için kullanırız.

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

Bunu bcgeçirdiğimizde hesaplamayı yapar.

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

@terdon - teşekkürler bunu yaptığınızda düzenleme yapıyordum 8-)
slm

3

Tamamen garip çözüm, gereksiz kedi veya grep komutları yok:

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

Awk_FTW beni dövdü görüyorum ama çıktı biçimlendirme güzel olabilir.


3

Bunu dene:

grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.