awk及sum求和!


 

            awk 也是一個強大的編輯工具,它比 sed 的功能更加強大,可以在無交互的情況下實現
相當復雜的文本操作。

1.awk 的語法

     awk [選項] ' print $1' 文件名 

選項

    -F指定分隔符

 [root@localhost ~]# awk -F: '{print $3}' /etc/passwd

0
1
2
3
4
5

2、awk 的內置變量
          ·FS:指定每行文本的字段分隔符,缺省為空格或制表位
          ·NF:當前處理的行的字段個數(列數)
          ·NR:當前處理的行的序數(行數)
          ·$0:當前處理的行的整行內容
         ·$n:當前處理的第 n 個字段(第 n 列)

          print:打印
 3、awk 的使用
在使用的過程中,可以使用邏輯操作符&&,表示“與”,||表示“或”,!表示“非”;還可
以進行簡單的數學運算,如+、-、*、/、%、^分別表示加、減、乘、除、取余、乘方

4、awk會根據空格和制表符,將每一行分成若干字段,依次用$1、$2、$3代表第一個字段、第二個字段、第三個字段等等。

********

awk最重要的是找到相同分割點然后隔斷取值

補充:

sort(排序)

sort -nr (數值從大到小排序反向)

uniq-c(顯示每個數重復的次數)

BEGIN(文件處理前)

END(文件處理后)

示例:

awk 'BEGIN{print "date\t age-n"\*******}{print $2\t$5}END{print hahaha} ip.txt

BEGIN中FS表示分隔符

BEGIN(文件處理前)

{文件處理中}

END{文件處理后}

basename:顯示基本目錄

dirname:顯示主目錄

示例:

[root@~~~]#cd /etc/systemctl/network-scripts

[root@~~~]#basename $NF

 net ***********s

[root@~~~]#dirname $NF

etc*********ctl

 

=======================================================================

實例:

要求:把.txt后綴的文件改成.mp4格式

[root@localhost ~]#mkdir /b

[root@localhost ~]#cd /b

[root@localhost b]#touch {1..10}.txt

[root@localhost b]# ls
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt

[root@localhost b]# ls | awk -F. '{print "mv "$1".txt "$1".mp4"}' | bash           //-F是分隔符、此處-F.是以.為分隔符
[root@localhost b]# ls
10.mp4 1.mp4  3.mp4  4.mp4   5.mp4   6.mp4    7.mp4     8.mp4    9.mp4

=======================================================================

求最大值(MAX)、最小值(MIN)、平均值、總和(SUM)

sum

[root@localhost ~]# df
文件系統                                1K-塊             已用               可用               已用%          掛載點
/dev/mapper/centos-root     49250820    4410180         44840640           9%                   /
devtmpfs                             480836               0              480836                0%                  /dev
tmpfs                                   497948               0              497948                0%                  /dev/shm
tmpfs                                   497948           9836           488112                 2%                   /run
tmpfs                                   497948              0              497948                0%                    /sys/fs/cgroup
/dev/sda1                           1038336        169568        868768               17%                   /boot
tmpfs                                  99592             64               99528                1%                      /run/user/1000
tmpfs                                  99592            68                99524               1%                     /run/user/0
tmpfs                                  99592           4                   99588                 1%                  /run/user/42

要求1:求 1K-塊的容量之和

[root@~~~]#df | awk -nr 'NR>=2 {print $2}'                          //NR表示行、NR>=2表示行數、print $2表示打印第二行

49250820
480836
497948
497948
497948
1038336
99592
99592
99592

[root@localhost ~]# df | awk -nr 'NR>=2 {sum+=$2}END{print sum}'             //sum+=$2表示sum=sum+$2、END表示結束后,print sum表示打印sum
52562612

要求2:求可用和已用之和

[root@localhost ~]# df | awk -nr 'NR>=2 {sum1+=$3;sum2+=$4}END{print sum1+sum2}'

52562612

test.txt文件內容:
9
11
35
21
42
118

求最大值:

awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1} END {print "Max=", max}' test.txt
Max= 118


求最小值:

awk 'BEGIN {min = 65536} {if ($1+0 < min+0) min=$1} END {print "Min=", min}' test.txt
Min= 9


求和:

cat test.txt|awk '{sum+=$1} END {print "Sum= ", sum}'
Sum=  236


求平均值:

cat test.txt|awk '{sum+=$1} END {print "Avg= ", sum/NR}'
Avg=  39.3333

=======================================================================

[root@localhost ~]# cat awk.txt
abcgsg
banner
age
food
feet
more

010-123456
0791-1235677
ip 192.168.200.1
ip 192.168.200.111
ip 192.168.200.11
aBggfH
Bggsgs
gaglag1

復制代碼
打印全文

[root@localhost ~]# awk '{print}' awk.txt print表示打印 abcgsg banner age food feet more 010-123456 0791-1235677 ip 192.168.200.1 ip 192.168.200.111 ip 192.168.200.11 aBggfH Bggsgs gaglag1
復制代碼
復制代碼
輸出1到3行的內容

[root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' awk.txt NR表示行 abcgsg banner age

輸出1行和三行

 [root@localhost ~]# awk 'NR==1||NR==3{print}' awk.txt
  abcgsg
  age

 
復制代碼
復制代碼
輸出所有基數行

[root@localhost ~]# awk '(NR%2)==1{print}' awk.txt %表示模 abcgsg age feet 0791-1235677 ip 192.168.200.111 aBggfH gaglag1
輸出所有偶數行 [root@localhost ~]# awk '(NR%2)==0{print}' awk.txt banner food more 010-123456 ip 192.168.200.1 ip 192.168.200.11 Bggsgs
復制代碼
輸出首字母是大寫的


[root@localhost ~]# awk '/^[A-Z]/{print}' awk.txt Bggsgs
復制代碼
Mem:剩余多大內存

[root@localhost ~]# free total used free shared buff/cache available Mem: 995896 590816 63260 8248 341820 195436 Swap: 2097148 27648 2069500 [root@localhost ~]# free | awk '/Mem:/{print int($3/$2*100)"%"}' $3表示第三列,$2表示第二列 59%

過濾出free總容量

 [root@localhost ~]# free | grep 'Mem:' | awk '{print $2}'
 995896

復制代碼
復制代碼
過濾IP地址

[root@localhost ~]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.200.115 netmask 255.255.255.0 broadcast 192.168.200.255 inet6 fe80::656c:1296:c062:6af7 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:c3:ed:86 txqueuelen 1000 (Ethernet) RX packets 4184 bytes 1545149 (1.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2329 bytes 257278 (251.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@localhost ~]# ifconfig ens33 | awk -F '[ :]+' 'NR==2 {print $3}' 192.168.200.115
復制代碼
復制代碼
1、提取出/etc/passwd 文件當中,UID小於1000的用戶名信息和UID信息

[root@server0 ~]# awk -F : ' $3<1000  {print $1,$3}' /etc/passwd



2、提取出/etc/passwd文件當中,shell環境為”/bin/bash”的用戶信息有shell信息

[root@server0 ~]# awk -F : ' $NF== "/bin/bash"  {print $1,$NF}' /etc/passwd



3、提取出/etc/passwd文件當中,第一行到第5行的用戶名相關信息

[root@server0 ~]# awk -F : ' (NR>=1&&NR<=5) {print $1}' /etc/passwd



4、打印/et/passwd奇數行

[root@server0 ~]# awk -F : '{if (NR%2!=0) print $0}' /etc/passwd



5、 打印UID不等於GID的用戶名

[root@server0 ~]# awk -F : '{if ($3!=$4) print $1}' /etc/passwd


6.awk提取登錄用戶ip地址

[root@fengxiaoli41 ~]# who |tail -1|awk -F"[ ()]+" '{print$5}'

192.168.10.1
復制代碼

 

復制代碼
過濾/etc/passwd中的用戶名

[root@localhost ~]# awk -F ':' '{ print $1 }' /etc/passwd

root
bin
daemon
adm
lp
sync

....

......

復制代碼

 

取出/etc/passwd中每行的最后一個值

[root@localhost ~]# awk -F '' '$0=$NF' /etc/passwd

 

復制代碼
取出用戶的登錄類型

[root@localhost ~]# awk -F ':' '{ print $NF}' /etc/passwd
':'表示以:為分割 $NF表示最后一列
/bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin
復制代碼

 

復制代碼
取出每行的家目錄的第一個字母

[root@localhost ~]# sed -nr '1,5 s#(.*):/(.)(.*/){2,}.*#\2#gp' /etc/passwd r b s v v
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM