Linux gzip,Linux - awk命令詳解

 2023-11-05 阅读 31 评论 0

摘要:目錄 1.? awk命令 1.1? awk工作原理 1.2? awk語法 1.2.1? awk完整語法 示例: 1.2.1? awk工作流程 1.3? 指定分隔符 1.3.1? -F 指定分隔符 1.3.2? 指定輸出分隔符 2.? free命令 2.1? free命令各項含義? ?2.1.1? 什么時候會使用交換分區? 2.1.2? 內核參數優化 2.2

目錄

1.? awk命令

1.1? awk工作原理

1.2? awk語法

1.2.1? awk完整語法

示例:

1.2.1? awk工作流程

1.3? 指定分隔符

1.3.1? -F 指定分隔符

1.3.2? 指定輸出分隔符

2.? free命令

2.1? free命令各項含義?

?2.1.1? 什么時候會使用交換分區?

2.1.2? 內核參數優化

2.2? ?常用選項

-m 以M為單位顯示內存的使用情況

-h? 以人類能讀懂的格式顯示

3.0? awk各種組合運用

3.1? ?awk進行計算

3.2? ?awk命令的引用shell變量?

3.3? awk內置函數

? length()函數

?substr()函數

3.4? awk的if和for循環

3.5 awk里的數組


1.? awk命令

awk: gawk - pattern scanning and processing language

1.1? awk工作原理

與sed一樣,均是一行一行的讀取,處理

sed作用于一整行的處理,而awk將一行分成數個字段來處理

字段:一段字符串 --》一段很多字符組成了一個字符串

Linux gzip、

#############################################

1.2? awk語法

1.2.1? awk完整語法

awk ‘BEGIN {commands} pattern {commands}END{commands}' file1

BEGIN:處理數據前執行的命令

END:處理數據后執行的命令

pattern:模式,每一行都執行的命令

awk 分隔符?BEGIN和END里的命令只是執行一次

pattern里的命令會匹配每一行去處理

示例:

[root@localhost lianxi]# cat /etc/passwd|awk -F ":" 'BEGIN{print "###start###"} $3>500&&$3<2000 {print $1,$3}END{print "###end###"}' 
###start###
polkitd 999
chrony 998
xiaowang 1000
chenhang 1001
zhnagjian 1002
zhangjian 1003
wangshenghu 1004
yalin 1005
nginx 997
lilanqing 1006
califeng 1007
cali123 1008
shimengmeng 1010
zhouyiwei 1011
zhaojunjie 1013
kimi 1014
kimi2 996
linhucong 1015
kimi3 1016
feng2 1018
feng3 1019
feng4 1020
feng5 1021
liudehua 1022
liming 1023
libai 1024
xiaoxiao 1025
xiyangyang 1026
meiyangyang 1027
lanyangyang 1028
zhangwuji 1029
liang 1030
###end###

awk -F ":" '{print $1,$2,$5}' /etc/passwd | head -5

[root@localhost 7.4]# awk -F ":" '{print $1,$2,$5}' /etc/passwd | head -5
root x root
bin x bin
daemon x daemon
adm x adm
lp x lp

-F ":"? :? awk選項,指定輸入分割符為:,

'{print}'? ? : 固定語法

$1,$2,$5? :輸出第一個,第二個,第五個字段

linux 命令詳解??,? : 是輸出分隔符,如果不加默認是沒有分隔符的。

[root@localhost 7.4]# awk -F ":" '{print $1$2$5}' /etc/passwd | head -5
rootxroot
binxbin
daemonxdaemon
admxadm
lpxlp

#############################################?

1.2.1? awk工作流程

執行BEGIN{commands}語句塊中的語句

從文件或stdin中讀取第一行,看有無模式匹配,若無則執行{}中的語句

若有則檢查該整行與pattern是否匹配,若匹配,則執行{}中的語句

若不匹配則不執行{}中的語句,接著讀取下一行

linux里awk,重復這個過程,知道所有行被讀取完畢

執行END{commands語句塊中的語句}

BEGIN 和 END 部分只是執行一次

中間部分每一行都執行一次

shell腳本awk??

#############################################

1.3? 指定分隔符

1.3.1? -F 指定分隔符

awk默認分隔符為空白:

示例:

[root@localhost 7.1]# cat grade.txt | awk '{print $2,$3,$4}'
name chinese english
cali 80 80
tom 90 90
jarry 70 100

分隔符不是空白時候可以使用-F選項來指定分隔符

[root@localhost 7.1]# cat /etc/passwd | tail | awk -F ":" '{print $1,$3,$4}'
sanle 9931 9932
test 9932 9935
wang 9933 9933
zhao 9934 9934
bobo 9935 9936
hang 9936 9937
mysql 27 27
bailongma 9937 9938
baigujing 9938 9939
yutujing 9939 9940

#############################################?

1.3.2? 指定輸出分隔符

awk函數。?使用OFS定義輸出分隔符

OFS="@@" 指定輸出分隔符為@@

[root@localhost 7.6]# awk -F ":" 'OFS="@@"{print $1,$7}' passwd 
mysql@@/sbin/nologin
bailongma@@/bin/bash
baigujing@@/bin/bash
yutujing@@/bin/bash
rrrge@@/bin/bash

#############################################?

2.? free命令

free查看內存使用的命令

[root@localhost 7.5]# free -mtotal        used        free      shared  buff/cache   available
Mem:            972         212         418           7         341         607
Swap:          2047           0        2047

#############################################?

2.1? free命令各項含義?

?Mem :memory 內存

Linux?total : 是總的物理內存(內存條的大小)

used:使用了多2.11少內存

shared:共享內存消耗的空間? ?---》進程和進程之間的通信方式

buff/cache? ? ---》buffer? cache? 緩存

? ? ? ? ? ? ? ? ? ? ? ? buffer :data from? memory? to? disk

? ? ? ? ? ? ? ? ? ? ? ? cache: data from disk to memory

linux中grep命令詳解、available : 可用的內存空間

????????????????????????一個新的進程他可以使用的內存空間 = free + buff和cache里的可用空間

swap(交換分區):從磁盤里劃分出來的一塊空間,用來當做內存使用,速度比較慢

????????????????????????????????????將不活躍的進程臨時存放到交換分區,當物理內存不足時就會采用交換分區

#############################################?

?2.1.1? 什么時候會使用交換分區?

內存消耗了70%時就會使用交換分區

awk使用linux命令。依據:在/proc/sys/vm/swappiness 文件里面規定了這一指標

? ? ? ? ? ? ? ?如下:意思為當物理內存還有30%時采用交換分區

[root@localhost 7.5]# cat /proc/sys/vm/swappiness 
30

#############################################?

2.1.2? 內核參數優化

內核參數優化,提升進程使用的效率,告訴系統盡可能多使用物理內存,物理內存速度快

[root@localhost 7.5]# cat /proc/sys/vm/swappiness 
30
[root@localhost 7.5]# echo 0  >/proc/sys/vm/swappiness 
[root@localhost 7.5]# cat /proc/sys/vm/swappiness 
0

?可以看到,當我們使用交換分區以后,可用內存增加了。

?

xargs命令詳解??

2.2? ?常用選項

-m 以M為單位顯示內存的使用情況

-h? 以人類能讀懂的格式顯示

?

############################################

3.0? awk各種組合運用

grep命令詳解。

#############################################?

3.1? ?awk進行計算

例1:統計uid>1000并且使用shell是bash的用戶的數量

[root@localhost 7.6]# awk -F ":" '$3>1000&&$7 ~ /bash/{print $1,$3,$7; i++}END{print "uid大于1000并且shell是bash的人數有:"i"人"}' passwd chenhang 1001 /bin/bash
zhnagjian 1002 /bin/bash
zhangjian 1003 /bin/bash
wangshenghu 1004 /bin/bash
yalin 1005 /bin/bash
lilanqing 1006 /bin/bash
califeng 1007 /bin/bash
cali123 1008 /bin/bash
shimengmeng 1010 /bin/bash
zhouyiwei 1011 /bin/bash
zhaojunjie 1013 /bin/bash
kimi 1014 /bin/bash
linhucong 1015 /bin/bash
kimi3 1016 /bin/bash
feng2 1018 /bin/bash
feng3 1019 /bin/bash
feng4 1020 /bin/bash
feng5 1021 /bin/bash
liudehua 1022 /bin/bash
liming 1023 /bin/bash
xiaoxiao 1025 /bin/bash
xiyangyang 1026 /bin/bash
meiyangyang 1027 /bin/bash
lanyangyang 1028 /bin/bash
zhangwuji 1029 /bin/bash
liang 1030 /bin/bash
user01 9901 /bin/bash
user02 9902 /bin/bash
user03 9903 /bin/bash
user04 9904 /bin/bash
user05 9905 /bin/bash
user06 9906 /bin/bash
user07 9907 /bin/bash
user08 9908 /bin/bash
user09 9909 /bin/bash
zhangheng 9921 /bin/bash
zhaomin 9922 /bin/bash
wuji 9923 /bin/bash
liangluyao 9924 /bin/bash
pingguo 9925 /bin/bash
jingshi 9926 /bin/bash
yueyang 9927 /bin/bash
tangpj 9928 /bin/bash
tangpz1 9929 /bin/bash
sc1 9930 /bin/bash
test 9932 /bin/bash
wang 9933 /bin/bash
zhao 9934 /bin/bash
bobo 9935 /bin/bash
hang 9936 /bin/bash
bailongma 9937 /bin/bash
baigujing 9938 /bin/bash
yutujing 9939 /bin/bash
rrrge 9940 /bin/bash
uid大于1000并且shell是bash的人數有:54人

例2:顯示第5行到第10行/etc/passed文件里的第3和第5字段的內容

[root@localhost 7.6]# awk -F ":" 'NR>=5 && NR<=10{print NR,$3,$5}' passwd 
5 4 lp
6 5 sync
7 6 shutdown
8 7 halt
9 8 mail
10 11 operator

#############################################?

3.2? ?awk命令的引用shell變量?

linux中awk命令詳解朱雙印、

在awk里面使用已經定義好的變量要用雙引號括起來,并且條件匹配注意轉義。

?

字段求和

?

awk命令詳解?#############################################

3.3? awk內置函數

? length()函數

?統計沒有設置密碼的用戶的數量以及用戶名

bobo
hang
mysql
bailongma
baigujing
yutujing
rrrge
mengmeng1
mengmeng2
mengmeng3
沒有設置密碼的用戶有87個

?substr()函數

類似于python的切片處理

例:輸出使用shell是bash的用戶的第7個字段的前4個字符,并輸出用戶名

?

shellawk命令詳解,?

例:輸出密碼字段長度小于2并且輸出用戶名字段的前2個字符,統計個數輸出出來。

[root@localhost 7.6]# awk -F : 'length($2)<=2 {print substr($1,1,2);num++}END{print num}' passwd
ro
bi
da
ad
lp
ha
my
ba
ba
yu
rr
me
me
me
87

#############################################?

3.4? awk的if和for循環

if語句后面執行多個命令的時候,使用{}括起來,最后的命令接;結尾,外面的else if 和 else前面就不用再接;了

?示例:使用awk命令來輸出passwd文件里哪些是超級用戶,系統用戶,普通用戶。

shell腳本awk命令,?

[root@localhost 7.5]# awk -F ":" '{if($3 ==0 ) print $1"是超級用戶";else if($3>1&&$3<=999) print $1"是系統用戶"; else print $1"是普通用戶"}' passwd 
root是超級用戶
bin是普通用戶
daemon是系統用戶
adm是系統用戶
lp是系統用戶
sync是系統用戶
shutdown是系統用戶
halt是系統用戶
mail是系統用戶
operator是系統用戶
games是系統用戶
ftp是系統用戶
nobody是系統用戶
systemd-network是系統用戶
dbus是系統用戶
polkitd是系統用戶
sshd是系統用戶
postfix是系統用戶
mysql是系統用戶
bailongma是普通用戶
baigujing是普通用戶
yutujing是普通用戶

例:使用awk命令來輸出passwd文件里哪些是超級用戶,系統用戶,普通用戶。并輸出各用戶的個數。

[root@localhost 7.6]# awk -F : '{if($3 == 0){print $1"是超級用戶";num1++;}else if($3>1 && $3 <1000){print $1"是系統用戶";num2++;}else{print $1 "是普通用戶";num3++;}}END{print"超級用戶有:"num1"系統用戶有:"num2"普通用戶有:"num3}' passwd 
root是超級用戶
bin是普通用戶
daemon是系統用戶
adm是系統用戶
lp是系統用戶
sync是系統用戶
shutdown是系統用戶
halt是系統用戶
mail是系統用戶
operator是系統用戶
games是系統用戶
tcpdump是系統用戶
sanle是普通用戶
test是普通用戶
wang是普通用戶
zhao是普通用戶
bobo是普通用戶
hang是普通用戶
mysql是系統用戶
bailongma是普通用戶
baigujing是普通用戶
yutujing是普通用戶
rrrge是普通用戶
mengmeng1是普通用戶
mengmeng2是普通用戶
mengmeng3是普通用戶
超級用戶有:1系統用戶有:23普通用戶有:63

#############################################?

3.5 awk里的數組

例:統計每個省份一共得到了多少票

[root@localhost 7.6]# awk '{vote[$1]+=$3}END{for (i in vote) print i,vote[i]}' lianxi.txt | sort -n -k 2
河南 6
江西 9
山東 12
湖南 43

練習題:

對nginx的日志文件access.log進行分析,分析出單個ip地址累計下載獲取的文件大小的總數(對每次訪問數據的大小進行求和),顯示下載總數最大的前100個ip地址和下載文件大小,按照下載文件大小的降序排列,顯示格式如下:
175.8.134.239 3456
172.105.77.209 78956

61.147.15.67 112345678
?

sed命令詳解?答案示例:

[root@localhost 7.6]# awk '{access[$1]+=$10}END{for (i in access) print i,access[i]}' access.log |sort -k 2 -nr|head -100

以下是一段nginx服務的日志:

[root@localhost 7.6]# cat nginx.log 
2019-04-25T09:51:58+08:00|a.google.com|47.52.197.27|GET /v2/depth?symbol=aaa HTTP/1.1|200|24|-|apple
2019-04-25T09:52:58+08:00|b.google.com|47.75.159.123|GET /v2/depth?symbol=bbb HTTP/1.1|200|407|-|python-requests/2.20.0
2019-04-25T09:53:58+08:00|c.google.com|13.125.219.4|GET /v2/ticker?timestamp=1556157118&symbol=ccc HTTP/1.1|200|162|-|chrome
2019-04-25T09:54:58+08:00|d.shuzibi.co|-||HEAD /justfor.txt HTTP/1.0|200|0|-|-
2019-04-25T09:55:58+08:00|e.google.com|13.251.98.2|GET /v2/order_detail?apiKey=ddd HTTP/1.1|200|231|-|python-requests/2.18.4
2019-04-25T09:56:58+08:00|f.google.com|210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|-
2019-04-25T09:57:58+08:00|g.google.com|47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4
2019-04-25T09:58:58+08:00|h.google.com|47.75.58.56|GET /v2/depth?symbol=ggg HTTP/1.1|200|404|-|safari
2019-04-25T09:59:58+08:00|i.google.com|188.40.137.175|GET /v2/trade_detail?symbol=hhh HTTP/1.1|200|6644|-|-
2019-04-25T10:01:58+08:00|j.google.com|2600:3c01:0:0:f03c:91ff:fe60:49b8|GET /v2/myposition?apiKey=jjj HTTP/1.1|200|110|-|scan

1.計算每分鐘的帶寬

方法1:

[root@localhost 7.6]# awk -F "|" '{print substr($1,1,16),$6}' nginx.log 
2019-04-25T09:51 24
2019-04-25T09:52 407
2019-04-25T09:53 162
2019-04-25T09:54 200
2019-04-25T09:55 231
2019-04-25T09:56 24
2019-04-25T09:57 397
2019-04-25T09:58 404
2019-04-25T09:59 6644
2019-04-25T10:01 110

方法2:

[root@localhost 7.6]# awk -F "|" '{bandwidth[(substr($1,1,16))]+=$6}END{for (i in bandwidth) print i,bandwidth[i]}' nginx.log 
2019-04-25T10:01 110
2019-04-25T09:56 24
2019-04-25T09:57 397
2019-04-25T09:58 404
2019-04-25T09:59 6644
2019-04-25T09:51 24
2019-04-25T09:52 407
2019-04-25T09:53 162
2019-04-25T09:54 200
2019-04-25T09:55 231

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/168456.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息