Thứ Hai, 11 tháng 3, 2013

[Shell] Bài tập 11: Awk

1. Lệnh ps cho phép in thông tin %CPU của mỗi process. Sử dụng awk tính tổng %CPU của máy đang chạy.
a=$(ps -eo pcpu | awk '{tongmem+=$1} END {print tongmem }')
echo "%CPU hien tai la: $a%"
for i in `seq 1 $a`
do
        echo -n "|"    
done
echo ""

#Bai khac tuong tu
a=$(ps -eo pcpu | awk '{tongcpu+=$1} END {print tongcpu}')
echo  "Tong % dung luong CPU: $a"
b=$(ps -eo pmem | awk  '{tongmem+=$1} END {print tongmem}')
echo  "Tong % memories: $b"
D=`echo "$a > 7.1" | bc -l`
if [[ $D -eq 1 ]]
then echo CANH BAO CPU vuot qua $a\%
fi
E=`echo "$b > 210" | bc -l`
if [[ $E -eq 1 ]]
then echo CANH BAO MEM VUOT QUA $b\%
fi

2. Sử dụng awk, in ra màn hình số lượng: dòng, từ (word) và ký tự trong 1 file. 

awk
{
        nc=nc+length($0)
        nw=nw+NF
}
END {print "So dong: " NR ",so tu " nw ",so ky tu " nc}


cat file | awk -f fileawk


3. Thống kế số user không được phép login. Hướng dẫn: trong file /etc/passwd, user không được login là user có shell login là /bin/nologin

cat /etc/passwd | grep 'nologin$' | awk -F":" '{print $1}'


4. Trong file thông tin sinh viên có thông tin MSSV: Tên sinh viên: Niên khóa: Lớp:Quê quán.
    a. Tìm tổng số sinh viên.
    b.Tìm tổng số lớp.
    c.Thống kê số sinh viên theo Quê quán
    d.Thống kê số sinh viên theo Lớp. Tìm Lớp có số sinh viên lớn nhất.

#!/bin/bash
echo -n "Tong so sinh vien: "
awk -F":" '{print $1}' sv | wc -l

echo -n "Tong so lop: "
awk -F":" '{print $4}' sv | sort | uniq | wc -l

echo "Thong ke so sinh vien theo que quan: "
awk -F":" '{print $5}' sv | sort | uniq -c >out
awk '{print "\t" $2 " co tong cong " $1 " sinh vien"}' out

max=0
echo "Thong ke so sinh vien theo lop: "
ds=$(awk -F":" '{print $4}' sv | sort | uniq)
for i in $ds
do
        tong=$(cat sv | grep $i | wc -l)
        if [[ $max -lt $tong ]]
        then max=$tong
        lopmax=$i
        fi
        echo --Lop $i co $tong sinh vien, gom:
        cat sv | grep $i | awk -F":" '{print $2}'
done
echo "Lop co so sinh vien lon nhat ($max sv) la lop $lopmax"



5. Cho cấu trúc file thông tin sinh viên hiến bao gồm 4 cột: MSSV, Tên sinh viên, ngày hiến máu, số máu được hiến, loại máu. Các cột cách nhau bằng dấu ":". Lưu ý một sv có thể hiến  máu nhiều lần.
   a. Tìm tổng số máu sinh viên đã hiến. 
   b. In tổng số máu theo loại. Lưu ý: ch ỉ có các loại máy O, AB, A, B
   c. In số máu mỗi sinh viên đã hiến theo cấu trúc sau: Ten sinh vien - MSSV đã hiến số máu
      Ví du: Sinh viên Nguyễn Văn An 09123VT đã hiến 400 ml máu
   d. Tìm sinh viên đã hiến nhiều máu nhất.

#!/bin/bash
echo -n "--------Tong so mau sinh vien da hien: "
cat sv | awk -F':' '{tong+=$4} END {print tong}'
echo  "-------Tong so mau theo loai: "
awk -F':' '{print $5}' sv | sort | uniq -c >dem
awk '{print "Nhom mau " $2 " co tong cong "$1}' dem
awk -F':' '{print $2 " " $1 " " $4}' sv | sort > somau
list=$(cat somau | awk '{print $2}' | sort | uniq)
for i in $list
do
    x=$(cat somau | grep $i | awk '{print $1 }' | uniq)
    y=$(cat somau | grep $i | awk '{sum+=$3} END {print sum}')
    echo Sinh vien $x "-" $i "da hien $y ml"
done>ds
echo -------So mau moi sv da hien:
cat ds
echo -------Sinh vien hien mau nhieu nhat:
h=$(cat ds | sed 's/^.*da hien //g' | sort -nr | sed -n '1p' | awk '{print $1}')
awk '$8 >= '$h' {print $0}' ds
 

Không có nhận xét nào:

Đăng nhận xét