awk基本用法 awk高級應用

sed 文件編輯器(vim) 非交互

sed 選項 ‘定位指令’ 文件 【定位指令一定要結合用】

-i 直接修改原文件
-n sed默認輸出
-r 支持擴展正則表達式

定位
1.行號 1 2,3 2~2 3~8
2.正則/正則/

a 追加append
i 插入insert
d 刪除 delete
c 行修改
s 關鍵詞修改

sed ‘s/x/y/’ 文件
sed 's/x/y/2' 文件
sed 's/x/y/g' 文件
sed 's# /root # /tmp #' 文件
()保留【相當於複製】
(abc) \1
(ttt) \2

vim a.txt
abc
test abc
world abc
sed -r 's/(abc)/<\1>/'
a{2,3} 優化
a{2,3}

(abc)保留:擴展正則
{abc}保留:基本正則

p 查看print


[root@sanpao1 ~]# head -1 /etc/passwd
root:x【必須有密碼才能登陸計算機,本身不是密碼】:0【uid號】:0:root【無意義,描述信息】:/root【自己的家目錄】:/bin/bash【登陸sheel】

[root@sanpao1 ~]# head -1 /etc/shadow
root【用戶名】:$6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.:【密碼】17171:0:99999【密碼有效時間。大約237年 】:7:::

從passwd裏面把能登陸的用戶名提取
bash
只要用戶名
大數據--》數據分析,數據挖掘

[root@sanpao1 ~]# grep "bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
usetr:x:1000:1000:usetr:/home/usetr:/bin/bash
zhansan:x:1001:1001::/home/zhansan:/bin/bash
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
jerry:x:1003:1003::/home/jerry:/bin/bash
[root@sanpao1 ~]# A=grep "bash" /etc/passwd
[root@sanpao1 ~]# echo $A
root:x:0:0:root:/root:/bin/bash usetr:x:1000:1000:usetr:/home/usetr:/bin/bash zhansan:x:1001:1001::/home/zhansan:/bin/bash zhangsan:x:1002:1002::/home/zhangsan:/bin/bash jerry:x:1003:1003::/home/jerry:/bin/bash
[root@sanpao1 ~]#

 for i in $A   【for循環是以空格爲分隔點】
 do
 done

[root@sanpao1 ~]# sed -n '/bash/s/:.//p' /etc/passwd
root
usetr
zhansan
zhangsan
jerry
[root@sanpao1 ~]# sed -n '/bash/s/:.
//p' /etc/passwd | wc -l
5
[root@sanpao1 ~]#

[root@sanpao1 ~]# head -1 /etc/shadow //提取密碼
root:$6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.:17171:0:99999:7:::

[root@sanpao1 ~]# A=sed '/bash/s/.*//' /etc/passwd

for i in $A
do
grep “$A” /etc/shadow
grep/sed
echo ${變量#:} 掐頭
echo ${變量%%:
} 去尾
done

echo ${變量#*:} 掐頭
echo ${變量%%:*} 去尾

取一個用戶名一個密碼
#!/bin/bash

A=sed -n '/bash/s/:.*//p' /etc/passwd
for i in $A
do
B=grep "$A" /etc/shadow
C=${B#:}
D=${C%%:
}
echo $i $D
done
~
[root@sanpao1 ~]# sh bash.sh
root $6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.
usetr $6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.
zhansan $6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.
zhangsan $6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.
jerry $6$4sHlnhht$5mmSrgKy04oDd/msB/GFrijuc63eSOI42sPbEdvtwa7/3ws3VZSGxy/WEo3mtjYenHG39i843zcIZhTYtgznX.
【如果用戶名後面式!!說明沒有設置密碼】


awk數據過濾工具 功能類似於grep
流處理器【逐行處理工具】

awk 選項 ‘條件{指令}’ 文件

[root@sanpao1 ~]# awk '{print}' /etc/passwd //全文打印===cat【沒有條件】

awk ‘/正則/’ /etc/passwd 【沒有指令】
[root@sanpao1 ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

awk 有列的概念,內置變量 //不能用“”,‘’中的$1,$2,awk可以看懂
$0【打印所有】$1【第一列】$2【第二列】


[root@sanpao1 ~]# tailf /var/log/secure //安全登陸日誌
Apr 16 20:03:56 sanpao1 polkitd[1059]: Finished loading, compiling and executing 6 rules
Apr 16 20:03:56 sanpao1 polkitd[1059]: Acquired the name org.freedesktop.PolicyKit1 on the system bus
Apr 16 20:04:28 sanpao1 sshd[1480]: Server listening on 0.0.0.0 port 22.
Apr 16 20:04:28 sanpao1 sshd[1480]: Server listening on :: port 22.
Apr 16 20:05:45 sanpao1 login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Apr 16 20:05:45 sanpao1 login: ROOT LOGIN ON tty1
Apr 16 20:06:01 sanpao1 sshd[2962]: Accepted publickey for root from 192.168.4.254 port 52415 ssh2: RSA 78:93:f8:74:7d:15:59:55:41:01:b5:06:45:91:0c:62
Apr 16 20:06:01 sanpao1 sshd[2962]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr 16 21:41:39 sanpao1 sshd[7983]: Accepted publickey for root from 192.168.4.254 port 52436 ssh2: RSA 78:93:f8:74:7d:15:59:55:41:01:b5:06:45:91:0c:62
Apr 16 21:41:39 sanpao1 sshd[7983]: pam_unix(sshd:session): session opened for user root by (uid=0)

RAR RAR破解
字典【passwd password 123456
暴力破解00 01 02 03 0a 0b

[root@sanpao1 ~]# cat /usr/share/dict/linux.words //linux中的字典

awk '/Failed/{print $11}' /var/log/secure
i=awk '/Failed/{print $11}' /var/log/secure
x=192.168.4.5 192.168.4.58 192.168.4.3
for i in $x
do
firew<tab>
done

NR 當前行
NF 當前行的列數

cat test.sh

hello the world
ni hao
sanpo

awk '{print NR}' test.sh

1
2
3

awk '/hello/{print NR}' test.sh

1

awk '{print NF}' test.sh

3
2
1

awk '/the/{print NF}' test.sh

3

awk '{print $NR}' test.sh //$NR所有行第一列

hello
hao

awk '{print $NF}' test.sh //$NF最後一列

world
hao
sanpo

##注意事項:awk默認以空格或tab爲分割,理解列

-F 選項可以制定分隔符

awk -F: '{print $1}' /etc/passwd

cat test.sh

hello the,world
ni hao:BJ
sanpo;ip

awk -F: '{print $2}' test.sh

BJ

awk -F, '{print $2}' test.sh

world

awk -F[, : ] '{print $2}' test.sh

awk: fatal: Unmatched [ or [^: /[,/

awk -F"[, : ]" '{print $2}' test.sh

the
hao

awk -F"[, : ; ]" '{print $2}' test.sh

the
hao
ip


df -h /

文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/rhel-root 50G 2.9G 48G 6% /

df / | awk '{print $4}'

可用
49365884

df / | awk '/root/{print $4}'

49365884

cipan=df / | awk '/root/{print $4}'
[ $cipan -le 5000 ] && mail 163

awk '{print "title"}' /etc/passwd //可以打常量

awk -F: '{print "賬戶:"$1,"uid:"$3}' /etc/passwd 【,讓兩個兩之間有空格】

awk -F: '{print "賬戶:"$1,"\tuid:"$3}' /etc/passwd 【\t相當於tab鍵】

賬戶:root uid:0
賬戶:bin uid:1
賬戶:daemon uid:2
賬戶:adm uid:3

awk -F: '{print "賬戶:"$1,"\nUID:"$3}' /etc/passwd 【\n 相當於回車,另起一行】

賬戶:root
UID:0
賬戶:bin
UID:1
賬戶:daemon
UID:2
賬戶:adm
UID:3

awk -F: '{print "賬戶:"$1,"\ruid:"$3}' /etc/passwd

uid:0root
uid:1bin
uid:2daemon
uid:3adm

awk '{print NR}' test.sh /etc/hosts //從自己角度

1
2
3
4
5

awk '{print FNR}' test.sh /etc/hosts //從原始文件角度

1
2
3
1
2

awk '' 文件

awk 'BEGIN{} 條件{} END{}' 文件

BEGIN後面的命令,在讀取文件之前執行
條件{}後面的命令,在讀取文件的過程中執行
END{}後面的命令,在讀取文件後執行

#awk -F: 'BEGIN{print "賬戶:\tUID"}'

awk -F: 'BEGIN{print "賬戶\t\tUID"} {print $1"\t\t"$3}' /etc/passwd

awk -F: 'BEGIN{print "賬戶\t\tUID"} {print $1"\t\t"$3} END{print "總共有:"NR}' /etc/passwd

賬戶 UID
root 0
bin 1
daemon 2
adm 3
總共有:47
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FS 保存或設置字段分隔符,例如FS=“:”
$n 指定分隔的第n個字段,如$1,$3分別表示第1、第3列
$0 當前讀入的整行文本內容
NF 記錄當前處理行的字段個數(列數)
NR 記錄當前已讀入行的數量(行數)
FNR 保存當前處理行在原文本內的序號( 行號)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

awk 'BEGIN{x=1;y=1;print x*y;print x+y;print x++}' //計算器

awk 'BEGIN{x=2.1;y=2;print x*y;print x+y;print x++}' //x++中的x表示當前值

4.2
4.1
2.1

awk 'BEGIN{x=2.1;y=2;print x*y;print x+y;print ++x}' //++x

4.2
4.1
3.1

統計一下,能登陸的用戶有多少個

awk 'BEGIN{x=0} /bash/{x++} END{print "總共有:"x}' /etc/passwd

總共有:5

awk '/bash/{x++} END{print "總共有:"x}' /etc/passwd

總共有:5

##提示:awk允許不定義變量,直接引用
如果是運算--0,如果是字符--空

awk條件:
1.正則(模糊查找)
/正則/ 全行匹配
~/正則/ 某一列匹配
!~/正則/ 某一列不匹配
awk有列的概念所以 awk -F: '$1~/正則/{指令} 文件'
awk -F: '/正則/{指令}'
/root/ 包含root即可(模糊查找)
2.字符數字(精準查找)
awk -F: '$1=="root"' /etc/passwd //=賦值,==判斷
awk -F: '$1!="root"' /etc/passwd
|
awk 中判斷用<、>、=
把所有uid大於500用戶名提取出來

awk -F: '$3>500{print $1,$3}' /etc/passwd

systemd-bus-proxy 999
systemd-network 998
polkitd 997
unbound 996
colord 995

3.邏輯判斷
把所有uid大於100,並且小於500用戶名提取出來
&& 並且
|| 或者
#awk -F: '$3>100&&$3<500{print $1,$3}' /etc/passwd

300以內(包含300),被3能整除和包含3的值

seq 300 | awk '條件' || '條件'

seq 300 | awk '$1~/3/' ||awk '$1%3==0'


#!/bin/bash
echo "Content-type:text/html"
echo ""

IP=ifconfig eth0 | awk '$1=="inet"{print $2}'

183 yum -y install httpd
184 systemctl start httpd
185 systemctl status httpd

vim /var/www/cgi-bin/
/var/www/html/a.html 靜態頁面:裏面的數據是不變的
test.py 動態頁面:每訪問一次,運行一下,每次結果不一樣

#!/bin/bash
echo "Contect-type:text/html" //不管是sheel還是python都固定不變的格式
echo "" //不管是sheel還是python都固定不變的格式

腳本
free 內核
##chmod +x /var/www/cgi-bin/test.sh

firefox http://192.168.4.254/cgi-bin/test.sh

awk 內存
awk 根分區

#!/bin/bash
echo "Content-type:text/html"
echo ""

IP=ifconfig private1 | awk '$1=="inet"{print $2}'
echo "本服務器的IP是$IP"
echo "</br>"
Mem=free |sed -n "2p" | awk '{print $4}'
echo "本服務器內存是$Mem"
echo "</br>"

user=who | wc -l
echo -n "當前有$user用戶登陸這臺計算機"
echo "</br>"

#!/bin/bash
echo "Content-type:text/html"
echo ""

IP=ifconfig private1 | awk '$1=="inet"{print $2}'
echo "本服務器的IP是$IP"
echo "</br>" //換行!!

df -h / |awk '{print "您的根分區剩餘:"$4}'
echo "</br>"

free | awk '/Mem/{print "內存剩餘:"$4}'
echo "</br>"

user=who | wc -l
echo -n "當前有$user用戶登陸這臺計算機"

firefox http://192.168.4.254/cgi-bin/test.sh

本服務器的IP是192.168.4.254
您的根分區剩餘:347G
內存剩餘:13140136
當前有4用戶登陸這臺計算機

客戶端:firefox http://ip/cgi-bin/test.sh

awk if語句

if [];then
a
b
fi
c

if(3>1){}

if(3>x){a}else{b}

if(3>8){a} else if(3>5){b} else{c}

if(3>1){a;b} ; c //c肯定會執行

if(3>1){a;b}
c

awk 'BEGIN{} 條件{} END{}' 文件 //if是個命令,不能打在條件中

awk '{if(){}else{}}'

awk '{if($3>500){x++}else{y++}} END{print x,y}' /etc/passwd
或者
sheel的思維模式如下:
x=0,y=0
if [$3>500] ;then
let x++
else
let y++
fi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章