awk
輸入分隔符(-F、FS)、輸出分隔符(OFS)
awk 裡引用 shell 變量
一. awk 和 shell 變量交換的問題#
awk 和 shell 變量交換的問題
1、使用 -v 選項
2、使用雙引號,但是 awk 內部的 $0 $1 等 $ 符號前需要使用 \ 轉義
3、使用單引號,將變量引起來,然後前面加一個 $ 符號再次引用變量的值,相當於取 2 次值
#示例:使用 -v選項
[root@cPen_A ~]# sg="panjinhao"
[root@cPen_A ~]# echo $sg
panjinhao
[root@cPen_A ~]# echo|awk '{print $sg}'
[root@cPen_A ~]# echo|awk -v bsg=$sg '{print bsg}'
panjinhao
[root@cPen_A ~]# ls|awk -v bsg=$sg '{print bsg}'
panjinhao #注:ls 輸出多行
panjinhao
……
panjinhao
[root@cPen_A lianxi]# vim test2.sh
awk -v var=$1 -F: '$1==var{print NR,$0}' /etc/passwd
[root@cPen_A lianxi]# bash test2.sh root
1 root:x:0:0:root:/root:/bin/bash
[root@cPen_A lianxi]# bash test2.sh sanchuang
21 sanchuang:x:1000:1000::/home/sanchuang:/bin/bash
#注:第1個$1 位置變量,第2個$1 第1個字段
#示例:使用雙引號,但是awk內部的$0 $1等$符號前需要使用\轉義
[root@cPen_A lianxi]# mv="zhangjie"
[root@cPen_A lianxi]# useradd zhangjie_123
[root@cPen_A lianxi]# cat /etc/passwd|awk -F: "/^$mv/{print \$1,\$3}"
zhangjie_123 12358
#示例:使用單引號,將變量引起來,然後前面加一個$符號再次引用變量的值,相當於取2次值
[root@cPen_A lianxi]# sg=3
[root@cPen_A lianxi]# awk -F: '/root/{print $1,$'$sg'}' /etc/passwd
root 0
operator 11
二。進程和進程之間通信的方式#
1、共享內存
2、信號量
3、信號
4、管道
5、隊列
6、Socket
[root@cPen_A lianxi]# cat /etc/shadow
第2個字段:密碼字段
*操作系統自帶的,沒有密碼的
!!用戶建的,沒有密碼的
提示:密碼字段為*、!!表示沒有設置密碼;密碼字段為空說明密碼被清除。
#示例:沒有設置密碼的用戶
[root@cPen_A lianxi]# cat /etc/shadow|awk -F: 'BEGIN{i=0}length($2)<=2{print $1,"沒有設置密碼";i++}END{print "一共有"i"個用戶"}'
三. awk 內置函數#
awk 內置的函數:
length()
int()
sqrt()
system()
字串函數
sub()
index()
length()
split()
數字函數
yum install python3 安裝 python3
#示例:生成0-1之間隨機數
[root@cPen_A lianxi]# echo |awk '{print rand()}'
0.237788
#示例:產生0-100之間隨機數
[root@cPen_A lianxi]# echo |awk '{print rand()*100}'
23.7788
[root@cPen_A lianxi]# echo |awk '{print int(rand()*100)}'
23
四。流控#
流控:流程控制 control flow
for
while
case
if
if語句
單分支
[root@cPen_A lianxi]# awk -F: '{if($1 ~ /\<...\>/)print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@cPen_A lianxi]# awk -F: '$1 ~ /\<.{3}\>/{print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
雙分支
[root@cPen_A lianxi]# awk -F: '{if($1 ~ /\<...\>/)print $0;else print "不符合要求"}' /etc/passwd
不符合要求
bin:x:1:1:bin:/bin:/sbin/nologin
#練習
/etc/passwd
$3是uid 用戶的編號
如果用戶的編號是0 --> 管理員
1~999 --> 程序用戶
大於1000 --> 普通用戶
最後統計出有多少管理員,多少程序用戶,多少普通用戶?
-----------------------------------------------------
[root@cPen_A ~]# awk -F: 'BEGIN{x=0;y=0;z=0}{if($3=="0") {print $1,"管理員";x++} else if($3>=1 && $3<=999) {print $1,"程序用戶";y++} else {print $1,"普通用戶";z++}}END{print "管理員"x,"程序用戶"y,"普通用戶"z}' /etc/passwd
root 管理員
bin 程序用戶
……
管理員1 程序用戶25 普通用戶40
五. awk 的 for 循環、數組#
awk 難點:
-
正則表達
-
if
-
內置函數
-
內置變量
-
for,數組 array
六. sed#
sed 是什麼?what --> text stream editor
有什麼用?where how --> 修改和替換文本 --> modify and substitute
sed 是一種支持正則表達式的非交互式流編輯工具(stream editor)
腳本中修改文本或者文本替換的最佳工具
交互式:一問一答。比如 python3 裡敲命令
2 個空間
pattern space --> 處理數據的地方 --> 處理一行數據後,模式空間會清空
hold space --> 臨時存放數據的地方
把 pattern space 放到 hold space 命令:h、H
把 hold space 放到 pattern space 命令:g、G
#注:性能意識,sed 在內存裡運行,比磁碟速度快
#注:容量意識
#示例:-i選項 直接在文件裡進行修改,不輸出到螢幕
[root@cPen_A lianxi]# sed -i 's/xiaomi/redmi/g' test.txt
#示例:通過管道傳過來
[root@cPen_A lianxi]# cat chen |sed 's/xiaomi/redmi/g'
[root@cPen_A lianxi]# cat -n /etc/passwd|head |tail -6
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
#示例:-n選項 值顯示匹配處理的行 (否則會輸出所有)
[root@cPen_A lianxi]# cat -n /etc/passwd|sed -n '5,10p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
sed 的 p 命令示例#
= :輸出行號
p命令輸出時:
連續的行
[root@localhost lianxi]# cat /etc/passwd|sed -n '1,5p'
不連續的行
[root@localhost lianxi]# cat /etc/passwd|sed -n '10p;20p'
示例:sed的p命令示例
sed -n ‘行號1,行號2p’ 輸出文件
[root@localhost lianxi]# cat /etc/passwd|sed -n '1,5p' #注:連續用,號
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost lianxi]# cat /etc/passwd|sed -n '=;1,5p' #注:=;輸出行號
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6
7
……
14
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '1,$p' #注:$p最後一行
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '5,+5p' #注:第5行開始 往後加5行
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '5,100!p' #注:取反,取1到4行
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
#示例:步長值
# cat -n /etc/passwd|sed -n '1~2p'
# cat -n /etc/passwd|sed -n '2~2p'
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '1~2p' #注:單數行,1開始每次往後2行
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
17 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
21 chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
23 nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '2~2p' #注:雙數行
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 mysql:x:1000:1000::/home/mysql:/sbin/nologin
22 redis:x:997:995:Redis Database Server:/var/lib/redis:/sbin/nologin
#示例:shell變量傳到sed裡
#雙引號 推薦
[root@localhost lianxi]# num1=6
[root@localhost lianxi]# num2=10
[root@localhost lianxi]# cat -n /etc/passwd|sed -n "${num1},${num2}p"
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
#單引號
[root@localhost lianxi]# cat -n /etc/passwd|sed -n ''${num1},${num2}'p'
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
----------------------------------------------------------
#示例:顯示包含bash的行
[root@localhost lianxi]# cat /etc/passwd|sed -n '/bash/p'
root:x:0:0:root:/root:/bin/bash
chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
[root@localhost lianxi]# cat /etc/passwd|egrep "bash"
root:x:0:0:root:/root:/bin/bash
chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
[root@localhost lianxi]# cat /etc/passwd|awk '/bash/'
root:x:0:0:root:/root:/bin/bash
chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
#示例:輸出#號開頭的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/p'
#示例:輸出不是#號開頭的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/!p'
#示例:顯示 不是#號和!號開頭的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -r -n '/^#|^$/!p' #注:-r支持更多正則
[root@localhost lianxi]# cat /etc/ssh/ssh_config |egrep -v '^#|^$'
#示例:顯示 以/結尾的行
[root@localhost lianxi]# df -h|egrep "/$"
/dev/mapper/centos-root 17G 9.9G 7.2G 58% /
[root@localhost lianxi]# df -h|sed -n '/\/$/p'
/dev/mapper/centos-root 17G 9.9G 7.2G 58% /
#示例:以a-Z開頭的行
[root@localhost lianxi]# cat /etc/passwd|sed -n '/^[a-Z]/p'
#示例:不以a-Z開頭的行
[root@localhost lianxi]# cat /etc/passwd|sed -n '/^[^a-Z]/p'
題目:截取nginx的access.log文件裡3月18號15:30:00 -- 16:48:10時間段內的所有訪問日誌
[root@cPen_A lianxi]# service firewalld stop #注:立馬停止firewalld服務
[root@cPen_A lianxi]# systemctl disable firewalld #注:設置firewalld服務開機不啟動-->下次重啟機器的時候不啟動
[root@cPen_A nginx]# tail -f access.log #注:動態監控最後一行
192.168.0.17 - - [09/Jan/2021:16:36:03 +0800] "GET /favicon.ico HTTP/1.1" 404 3650 "http://192.168.0.118/" "Mozilla/5.0 (Linux; Android 10; PCT-AL10; HMSCore 5.1.0.300; GMSCore 20.26.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 HuaweiBrowser/11.0.5.304 Mobile Safari/537.36" "-"
[root@cPen_A nginx]# pwd
/var/log/nginx #注:nginx的日誌文件的路徑
[root@cPen_A nginx]# ls
access.log access.log-20201202.gz error.log error.log-20201202.gz
#注:access.log是nginx的訪問日誌文件,記錄訪問過我們的網站的信息
[root@cPen_A nginx]# cat access.log | awk -F'[()]' '{print $2}'|sort|uniq -c|sort -nr
13 Windows NT 10.0; WOW64 #注:排序去重 再降序排序 顯示數量
4 Linux; Android 10; PCT-AL10; HMSCore 5.1.0.300; GMSCore 20.26.14
---------------------------------------------------------------------------
[09/Jan/2021:16:32:46 +0800] --> 09/Jan/2021:16:32:46
[09/Jan/2021:16:33:07 +0800] --> 09/Jan/2021:16:32:46
#示例:查找該時間段的所有訪問日誌
[root@cPen_A nginx]# cat access.log|sed -n '/09\/Jan\/2021:16:32:46/,/09\/Jan\/2021:16:33:07/p'
#示例:正則寫法
[root@cPen_A nginx]# cat access.log|sed -r -n '/09\/Jan\/2021:16:(3[789]|4[0-9]|5[01]):(0[1-9]|[1-5][0-9])/p'
#注:分鐘的範圍37~51 秒的範圍01~59
#37~51
#37~39
#40~49
#50~51
#01~59
0[1-9]|[1-5][0-9]
sed 的 d 命令示例#
sed的d命令示例
刪除操作可以根據行號和匹配模式進行操作
#示例:刪除有denghui的行
[root@cPen_A nginx]# cat /etc/passwd|sed '/denghui/d'
#示例:-i動原文件 刪除有redmi這行
[root@cPen_A lianxi]# sed -i '/redmi/d' test.txt
#示例:根據行刪除
[root@cPen_A lianxi]# sed -i '2d' test.txt #注:刪除第2行
sed查找方式:
1、根據行號
2、根據模式 -->正則表達式=字符+特殊符號
3、根據字符串
#示例:在第4行後面追加huawei
[root@cPen_A lianxi]# sed -i '4a huawei' test.txt
#示例:在第4行前面插入apple
[root@cPen_A lianxi]# sed -i '4i apple' test.txt
#示例:在VIVO這行前一行插入OPPO
[root@cPen_A lianxi]# sed -i '/VIVO/i OPPO' test.txt
#示例:在VIVO同行後面添加APPLE.&表示前面全部
[root@cPen_A lianxi]# sed -i 's/VIVO/& APPLE/' test.txt
#示例:將所有為huawei都替換成sanchuang
[root@cPen_A lianxi]# sed -i 's/huawei/sanchuang/g' test.txt
sed的命令:
p
d
a
i
s
c
r
w