補充
1.printf '%s\t%s' 字符串 中,\t一定不要加雙引號,這一點和在awk中使用的時候有所不同
2.其中%s也可以寫成%ns,n可以被用來設置列寬,默認右對齊
#打印輸出文件系統的使用情況
[root@localhost ~]# printf '%-30s\t%s\n' $(df -h | awk '{print $1"\t"$(NF-1)}')
文件系統 已用%
devtmpfs 0%
tmpfs 0%
tmpfs 3%
/dev/nvme0n1p3 11%
/dev/nvme0n1p1 13%
tmpfs 0%
或
[root@localhost ~]# df -h | awk '{printf "%-20s\t%s\n",$1,$(NF-1)}'
文件系統 已用%
devtmpfs 0%
tmpfs 0%
tmpfs 3%
/dev/nvme0n1p3 11%
/dev/nvme0n1p1 13%
tmpfs 0%
3.若想要在包含匹配中調用變量,則需要使用單引號
[root@localhost ~]# awk '$2~/[un]/{print $0}' cut.txt
1 xqian 83 75 93
2 xsun 74 96 63
[root@localhost ~]# name=un[root@localhost ~]# awk '$2~/['$name']/{print $0}' cut.txt
1 xqian 83 75 93
2 xsun 74 96 63#若使用雙引號則沒有任何用處
[root@localhost ~]# awk '$2~/["$name"]/{print $0}' cut.txt
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
4.若內存使用率超過15%,則打印紅色的內存超標,當前使用率是多少
[root@localhost ~]# free -htotal used free shared buff/cache available
Mem: 1.9Gi 419Mi 1.2Gi 7.0Mi 455Mi 1.5Gi
Swap: 2.0Gi 0B 2.0Gi
[root@localhost ~]# cat jiance.sh
#!/bin/bash
mem=$(printf '%.f\n' $(free | awk '/Mem/{print $3/$2*100}'))
[ $mem -gt 15 ] && echo -e "\e[31m內存超標,當前使用率是$mem%\e[0m"
[root@localhost ~]# bash jiance.sh
內存超標,當前使用率是22%
[root@localhost ~]#
5.取總的cpu使用率
[root@localhost ~]# top -n 1 | awk '/%Cpu/{printf "%.f\n",$2+$4}'
3
sed命令
功能:實現非交互式對文件進行選取、替換、刪除、新增等操作的命令,即不進入文本對其內容進行修改;主要包括讀取、執行和顯示三個過程
格式:sed [選項]? '動作'? 文件名
選項
- -n:將經過處理后的數據輸出到控制臺上;不加-n輸入全文+指定行
- -i:直接修改文件內容;默認下sed不會對文件直接修改,而是在內存中修改并將結果顯示在控制臺
動作
- p:打印,輸出指定行
- a:追加,在當前行后追加一行或多行
- i:插入,在當前行前插入一行或多行
- d:刪除,刪除指定的一行或多行
- c:整行替換,用c后面的字符串替換元數據指定行的數據
- s:字符替換,用一個字符串替換另外一個字符串,格式“行范圍s/舊字符/新字符/g”
數據準備
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
查看
1.顯示cut.txt中第三行的信息
[root@localhost ~]# sed '3p' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
1 xqian 83 75 93
2 xsun 74 96 63[root@localhost ~]# sed -n '3p' cut.txt
1 xqian 83 75 932.顯示第二行到第四行的信息,查看連續的多行
[root@localhost ~]# sed -n '2,4p' cut.txt
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 633.顯示第二行和第四行的信息,查看不連續的多行
[root@localhost ~]# sed -n '2p;4p' cut.txt
0 xzhao 95 59 78
2 xsun 74 96 634.查看符合條件的行,支持正則,擴展正則要使用轉義符
[root@localhost ~]# sed -n '/a/p' cut.txt
0 xzhao 95 59 78
1 xqian 83 75 93[root@localhost ~]# sed -n '/[23]\?/p' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
[root@localhost ~]# sed -n '/[23]/p' cut.txt
1 xqian 83 75 93
2 xsun 74 96 63
追加
1.追加,不加-i不改變元數據
#在指定行后面追加
[root@localhost ~]# sed '3a 12\txli\t80\t90\t100\t' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
12 xli 80 90 100
2 xsun 74 96 63
#在指定行前面追加
[root@localhost ~]# sed '3i 12\txli\t80\t90\t100\t' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
12 xli 80 90 100
1 xqian 83 75 93
2 xsun 74 96 632.改變元數據
[root@localhost ~]# sed -i '3i 12\txli\t80\t90\t100\t' cut.txt
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
12 xli 80 90 100
1 xqian 83 75 93
2 xsun 74 96 633.-a和-i可以在指定位置追加多行
[root@localhost ~]# sed '3a 100 zhangsan \n200 lisi' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
100 zhangsan
200 lisi
2 xsun 74 96 63
刪除
1.刪除第三行的數據
[root@localhost ~]# sed '3d' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 632.刪除第二行到第四行的數據,刪除多行數據
[root@localhost ~]# sed '2,4d' cut.txt
ID NAME LINUX MYSQL DOCKER
2 xsun 74 96 633.刪除第二行和第四行的數據
[root@localhost ~]# sed '2d;4d' cut.txt
ID NAME LINUX MYSQL DOCKER
12 xli 80 90 100
2 xsun 74 96 634.刪除第三行的元數據,加上-i選項才能更改元數據
[root@localhost ~]# sed -i '3d' cut.txt
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
替換
1.將第三行內容整行替換
[root@localhost ~]# sed '3c No such person' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
No such person
2 xsun 74 96 632.將第三行中的x替換成xiao
[root@localhost ~]# sed '3s/x/xiao/g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xiaoqian 83 75 93
2 xsun 74 96 633.將所有行中的x替換成xiao
[root@localhost ~]# sed 's/x/xiao/g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xiaozhao 95 59 78
1 xiaoqian 83 75 93
2 xiaosun 74 96 634.將指定的一行內容替換成空
[root@localhost ~]# sed '3s/[0-9]//g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78xqian
2 xsun 74 96 635.同時替換多行,用;隔開
[root@localhost ~]# sed '3s/^/#/g;4s/[0-9]//g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
#1 xqian 83 75 93xsun 6.加上-i選項更改元數據
[root@localhost ~]# sed -i '3s/^/#/g;4s/[0-9]//g' cut.txt
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
#1 xqian 83 75 93xsun
sed命令練習
問題1:關閉selinux
想要關掉selinux,用sed命令修改配置文件
[root@localhost ~]# sed '22s/disabled/enforcing/' /etc/selinux/config
問題2:校驗整數
接收客戶端輸入,若是純整數則打印是整數,否則打印格式不正確
[root@localhost ~]# cat num.sh
#!/bin/bash
read -p "please enter a num:" num
jq=$(echo $num | sed 's/[0-9]//g')
[ -z "$jq" ] && echo 是整數 || echo 格式不正確[root@localhost ~]# bash num.sh
please enter a num:123
是整數[root@localhost ~]# bash num.sh
please enter a num:12d
格式不正確
問題3:修改網卡配置
用sed命令修改網卡配置文件,進行IP地址獲取方式的切換
1.讀取當前使用的網卡名
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $NF}'
ens160
2.將較長的配置文件名賦予變量
[root@localhost ~]# interface=`ip add | grep "inet[^6]" | grep -v "127" | awk '{print $NF}'`
[root@localhost ~]# cf="/etc/NetworkManager/system-connections/$interface.nmconnection"
3.查看當前網卡配置,并顯示行號
[root@localhost ~]# cat -n $cf1 [connection]2 id=ens1603 uuid=4c163b33-6eca-3917-b856-9bff2df0e9474 type=ethernet5 autoconnect-priority=-9996 interface-name=ens1607 timestamp=17555496048 9 [ethernet]10 11 [ipv4]12 method=manual13 address=192.168.66.66/24,192.168.66.214 dns=202.106.0.2015 16 [ipv6]17 addr-gen-mode=eui6418 method=auto19 20 [proxy]
4.將ip地址改為手動獲取(真實實驗中需要加-i選項)
[root@localhost ~]# sed '12s/auto/manual/' $cf
5.手動添加ip地址、掩碼、網關和dns(真實實驗中需要加-i選項)
[root@localhost ~]# sed '12a address=192.168.66.66/24,192.168.66.2\ndns=202.106.0.20' $cf