Shell語(yǔ)法
~: 家目錄 cd - 代表切到上一級(jí)目錄
!: 執(zhí)行歷史命令!$NUM !!執(zhí)行上一次命令
$: 變量
+ - * / %: 加 減 乘 除 取余
&: 后臺(tái)執(zhí)行
*: 匹配所有
?: 匹配除回車以外的一個(gè)字符
;: 執(zhí)行多個(gè)命令 之間用蛤签;分割
|; 管道符 上一個(gè)命令的輸出作為下一個(gè)命令的輸入
\; 轉(zhuǎn)義字符
echo $?: 判斷上一條命令是否執(zhí)行成功,0成功1否
` `:反引號(hào),命令中執(zhí)行命令 echo "date is `date`"
'':單引號(hào)與雙引號(hào)一樣,但是單引號(hào)不解釋變量
Shell 重定向
<: 重定向輸出 wc -l < file
>: 重定向輸入 覆蓋原有數(shù)據(jù) echo "123" > file
<<: 重定向追加輸出 fdisk /dev/sda <<EOF ...... EOF
>>: 重定向追加輸入 在原有末尾追加 echo "123" >> file
Shell數(shù)學(xué)運(yùn)算
expr: 只能做整數(shù)運(yùn)算 格式古板
expr 1 + 2
expr 1 - 2
expr 1 \* 2
expr 10 / 2
expr 11 % 2 取余
bc:
echo "`echo "scale=3;332/2827*100" | bc`%"
Shell中(())也可以用來(lái)運(yùn)算
echo
輸出內(nèi)容
-n:不自動(dòng)換行
-e: 轉(zhuǎn)義符不按字符串輸出
#!/bin/bash
echo -e "\t\t\t\t Frutis"
echo -e "\t(1 Apple"
echo -e "\t(2 Banana"
[root@K8S-Node2 ~]# bash echo.sh
Frutis
(1 Apple
(2 Banana
數(shù)組
ARRAY1=('a' 'b' 'c' 'd')
echo ${ARRAY1[1]} #echo {$數(shù)組名[索引]} 獲取索引為1的元素
echo ${數(shù)組名[@]} #數(shù)組中所有元素
echo ${#數(shù)組名[@]} #統(tǒng)計(jì)數(shù)組元素個(gè)數(shù)
echo ${!數(shù)組名[@]} #獲取元素索引
echo ${數(shù)組名[@]:1} #從索引1開(kāi)始讀取元素
echo ${數(shù)組名[@]:1:5} #從索引1開(kāi)始 獲取5個(gè)元素
declare -a #可以查看系統(tǒng)中的數(shù)組
關(guān)聯(lián)數(shù)組
聲明關(guān)聯(lián)數(shù)組
declare -A 數(shù)組名
數(shù)組名[key]=value
數(shù)組名=([key]=value)
declare -A people
declare -A people1
people=([name]='dzy' [age]=21 [taller]=180)
echo ${people[name]}
echo ${people[age]}
echo ${people[taller]}
people1[name]='cff'
people1[age]=20
echo ${people1[name]}
數(shù)學(xué)比較運(yùn)算
運(yùn)算符解釋
-eq 等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于
NUM1=`echo "1.5*10"|bc|cut -d "." -f1`
NUM2=$((10*2))
test $NUM1 -eq $NUM2;echo $?
字符串比較運(yùn)算
運(yùn)算符 | 說(shuō)明 | 距離 |
---|---|---|
= | 檢測(cè)兩個(gè)字符串是否相等,相等返回 true靶病。 | [ b ] 返回 false。 |
!= | 檢測(cè)兩個(gè)字符串是否相等口予,不相等返回 true娄周。 | [ b ] 返回 true。 |
-Z | 檢測(cè)字符串長(zhǎng)度是否為0沪停,為0返回 true煤辨。 | [ -z $a ] 返回 false。 |
-n | 檢測(cè)字符串長(zhǎng)度是否不為 0木张,不為 0 返回 true众辨。 | [ -n "$a" ] 返回 true。 |
$ | 檢測(cè)字符串是否為空舷礼,不為空返回 true鹃彻。 | [ $a ] 返回 true。 |
test $USER=="root" ;echo $?
test -z "$USER";echo $?
test -n "$USER";echo $?
文件比較與檢查(test命令)
-b<文件>:如果文件為一個(gè)塊特殊文件妻献,則為真蛛株;
-c<文件>:如果文件為一個(gè)字符特殊文件,則為真育拨;
-d<文件>:如果文件存在且為目錄則為真泳挥;
-e<文件>:如果文件存在,則為真至朗;
-f<文件>:如果文件為一個(gè)普通文件屉符,則為真;
-g<文件>:如果設(shè)置了文件的SGID位锹引,則為真矗钟;
-G<文件>:如果文件存在且歸該組所有,則為真嫌变;
-k<文件>:如果設(shè)置了文件的粘著位吨艇,則為真;
-O<文件>:如果文件存在并且歸該用戶所有腾啥,則為真东涡;
-p<文件>:如果文件為一個(gè)命名管道冯吓,則為真;
-r<文件>:如果文件可讀疮跑,則為真组贺;
-s<文件>:如果文件的長(zhǎng)度不為零,則為真祖娘;
-S<文件>:如果文件為一個(gè)套接字特殊文件失尖,則為真;
-u<文件>:如果設(shè)置了文件的SUID位渐苏,則為真掀潮;
-w<文件>:如果文件可寫(xiě),則為真琼富;
-x<文件>:如果文件可執(zhí)行仪吧,則為真。
邏輯運(yùn)算
邏輯與運(yùn)算 && 真真為真 真假為假 假假為假
邏輯或運(yùn)算 || 真真為真 真假為真 假假為假
邏輯非運(yùn)算 鞠眉! 非真既假 非假既真 (即取相反)
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if語(yǔ)法
if [ condition ] #判斷condition(條件),指的是Shell中的五中運(yùn)算
then
commands
fi
if (()) #雙小括號(hào)可做數(shù)學(xué)運(yùn)算
then
command
fi
if
if [[]] #雙中括號(hào)可做字符串匹配
then
command
fi
if [ ! -d /tmp/abc ]
then
mkdir -p /tmp/abc
echo "123"
echo "create /tmp/abc ok"
fi
if then else語(yǔ)句
if [ condition ]
then
command
else
command
fi
if [ ! -d /tmp/abc ]
then
mkdir -p /tmp/abc
echo "123"
echo "create /tmp/abc ok"
else
echo "i am your father"
fi
if嵌套
if [ condition ]
then
command
else
if [condition ]
then
command
else
command
fi
if [ $1 -eq $2 ]
then
echo "$1=$2"
else
if [ $1 -gt $2 ]
then
echo "$1 > $2"
else
echo "$1 < $2"
fi
fi
多部判斷
if [ condition ]
then
command
elif [ condition ]
then
command
elif [ condition ]
then
command
else
command
fi
nginx自動(dòng)安裝腳本實(shí)例
#!/bin/bash
wget http://nginx.org/download/nginx-1.6.2.tar.gz
if [ $? -eq 0 ]
then
tar -zxvf nginx-1.6.2.tar.gz;
cd nginx-1.6.2;
./configure --prefix=/usr/local/nginx
if [ $? -eq 0 ]
then
make
if [ $? -eq 0 ]
then
make install
else
echo "安裝失敗"
fi
else
echo "編譯失敗"
fi
else
echo "下載失敗"
fi
For語(yǔ)句介紹
for var in var1 var2 .....
do
command
done
例如
for var in `seq 1 9`
do
echo $var
done
#C格式語(yǔ)法
for (( i=0;i<10;i++ )) # i=0 條件為 i<10,i++ 每次i+1
do
echo $i
done
#多變量C格式語(yǔ)法
for (( i=10,m=0;i>0,m<10,i--,m++ )) #i=10 條件為 i>0 即循環(huán)制i=0
do
echo -e "$i\t$m"
done
循環(huán)控制
sleep N 腳本執(zhí)行到該步休眠N秒
for i in `seq 9 -1 1`
do
echo -n -e "\b$i"
sleep 1
done
echo
for ((;;)) #無(wú)限循環(huán)
do
ping -c1 $1 &>/dev/null #ping -c1 ping一次 結(jié)果輸出到/dev/null
if [ $? -eq 0 ]
then
echo "`date +"%F %H:%M:%S"`: $1 is UP"
else
echo "`date +"%F %H:%M:%S"`: $1 is DOWN"
fi
sleep 5
done
continue 跳過(guò)本次循環(huán),繼續(xù)執(zhí)行循環(huán)以及以下代碼
for ((i=1;i<10;i++))
do
if [ $i -eq 5 ]
then
continue
else
echo $i
fi
done
break 跳出循環(huán)繼續(xù)執(zhí)行后續(xù)代碼
for i in `seq 1 1 9`
do
if [ $i -eq 9 ]
then
break
else
echo $i
fi
done
多層循環(huán)嵌套
for ((i=1;-<100;i++))
do
echo "#loop $i"
for ((;;))
do
echo "haha" #內(nèi)層嵌套for循環(huán) 如果不跳出內(nèi)層for循環(huán) 則外層循環(huán)將不會(huì)進(jìn)行第二次循環(huán),內(nèi)存循環(huán)將進(jìn)入死循環(huán)
break 2 #2的意思是 從內(nèi)到外的循環(huán)嵌套成熟 從內(nèi)到外 1 2
done
sleep 3
done
While循環(huán)語(yǔ)句
while [ condition ] #條件成立循環(huán),條件不成立停止循環(huán)
do
commands
done
read -p "請(qǐng)輸入數(shù)字: " NUM1
while [ $NUM1 -gt 0 ]
do
echo "大于"
sleep 3
done
while的嵌套if for while
打印 1-10 當(dāng) i = 5 時(shí)停止
i=1
while [ $i -lt 10 ]
do
i=$((i+1))
echo $i
if [ $i -eq 5 ];then
break #跳過(guò)5 break換成continue
fi #相當(dāng)于Python中的計(jì)數(shù)器
done
while與for打印99乘法表
i=1
while [ $i -lt 10 ]
do
for ((m=1;m<=$i;m++));do
echo -n -e "$i * $m = $((i*m))\t"
done
echo #此echo代表?yè)Q行
i=$((i+1))
done
while嵌套while打印99乘法表
i=1
while [ $i -lt 10 ];do
m=1
while [ $m -le $i ];do
echo -n -e "$i * $m = $((i*m))\t"
m=$((m+1))
done
echo #此echo代表?yè)Q行
i=$((i+1))
done
Case語(yǔ)句
根據(jù)不同的條件執(zhí)行不同的代碼塊
case 變量 in
條件1)
代碼塊
;;
條件2)
代碼塊
;;
esac
read -p "NUM: " i
case $i in
1)
echo "hehe"
;;
2)
echo "heihei"
;;
*)
echo "1|2"
;;
esac
Shell特殊變量
$@: 與*類同,不同之處在于不參照IFS
$#: 代表傳遞參數(shù)數(shù)量
$?: 執(zhí)行上一個(gè)指令的返回值
$-: 最近執(zhí)行的 foreground pipeline的選項(xiàng)參數(shù)
$$: 本身的PID
$: 執(zhí)行上一個(gè)背景指令的PID
$_: 最后執(zhí)行的命令
$N: Shell的第N個(gè)外傳采納數(shù)
函數(shù)
函數(shù)名() {
代碼塊
return
}
function 函數(shù)名{
代碼塊
return
}
Nginx啟動(dòng)腳本示例
#variables
nginx_install_doc=/usr/local/nginx
nginxd=$nginx_install_doc/sbin/nginx
pid_file=$nginx_install_doc/logs/nginx.pid
# Source funciton libary
if [ -f /etc/init.d/functions ];then
. /etc/init.d/functions
else
echo "error"
exit
fi
if [ -f $pid_file ];then
nginx_process_id=`cat $pid_file`
nginx_process_num=`ps -aux | grep $nginx_process_id | grep -v "grep" | wc -l`
fi
#function
function start {
if [ -f $pid_file ] && [ $nginx_process_num -ge 1 ];then
echo "nginx running"
else
if [ -f $pid_file ] && [ $nginx_process_num -lt 1 ];then
rm -f $pid_file
daemon $nginxd
fi
daemon $nginxd
fi
}
function stop {
if [ -f $pid_file ] && [ $nginx_process_num -ge 1 ];then
action "nginx stop" killall -s QUIT $nginxd
rm -rf $pid_file
else
action "nginx stop fail" killall -s QUIT $nginxd 2>/dev/null
fi
}
function restart {
stop
sleep 3
start
}
function reload {
if [ -f $pid_file ] && [ $nginx_process_num -ge 1 ];then
action "nginx reload" stop
sleep 3
action "nginx reload complete" start
fi
}
function status {
if [ -f $pid_file ] && [ $nginx_process_num -ge 1 ];then
echo "Nginx running....."
else
echo "Nginx stop......"
fi
}
case $1 in
start) start;;
stop) stop;;
restart) restart;;
status) status;;
reload)reload;;
*)echo "Usage: $0 start|stop|restart|reload|status";;
esac
正則表達(dá)式
正則表達(dá)式是一種文本模式匹配.包含普通字符和特殊字符.可以喲用來(lái)檢查一個(gè)字符串包含某種子串薯鼠。將匹配的子串替換或者從字符串中取出
在shell中 只有 grep awk sed 支持正則表達(dá)式
特殊字符
定位符 | 說(shuō)明 |
---|---|
^ | 錨定開(kāi)頭 ^a 以a開(kāi)頭 默認(rèn)錨定一個(gè)字符 |
$ | 錨定結(jié)尾 a$ 以a結(jié)尾 默認(rèn)錨定一個(gè)字符 |
默認(rèn)的grep不支持正則表達(dá)式 需要加 -E grep -E 等于 egrep
匹配符 | 說(shuō)明 |
---|---|
. | 匹配除回車意外的任意字符 |
[] | 字符類,匹配括號(hào)中的一個(gè)字符 |
[^] | 表示取括號(hào)中字符類的相反值 |
() | 字符串分組 |
\ | 轉(zhuǎn)義字符 |
[root@K8S-Node3 ~]# egrep "^ac$" file
ac
.代表任意字符.表示以a開(kāi)頭以c結(jié)尾中間任意字符的字符串
[root@K8S-Node3 ~]# egrep "^a.c$" file
asc
a2c
awc
aec
atc
[]與.的意思一樣.但是可以在[]中定義字符或者數(shù)字區(qū)間
[root@K8S-Node3 ~]# egrep "^a[0-9]c$" file
a2c
a2c
a3c
a4c
a5c
a6c
a7c
[root@K8S-Node3 ~]# egrep "^a[a-z]c$" file
asc
awc
aec
atc
[root@K8S-Node3 ~]# egrep "^a[^a-z]c$" file
a2c
a2c
a3c
a4c
a5c
a6c
a7c
[root@K8S-Node3 ~]# egrep "^a[^0-9]c$" file
asc
awc
aec
atc #在[]中加上^代表取相反的值
[root@K8S-Node3 ~]# egrep "^a*c$" file
ac
[root@K8S-Node3 ~]# egrep "^a\*c$" file
a*c
[root@K8S-Node3 ~]# egrep "^(a|b)c$" file #^(a|b) 表示以a或b開(kāi)頭的字符串
ac
ac
bc
[root@K8S-Node3 ~]#
限定符
限定符 | 說(shuō)明 |
---|---|
* | 某個(gè)字符之后加*表示該字符出現(xiàn)多次或不出現(xiàn) |
? | 某個(gè)字符之后加?表示該字符不出現(xiàn)或只出現(xiàn)一次 |
+ | 某個(gè)字符之后加+ 表示該字符出現(xiàn)一次或多次,但必須出現(xiàn)一次 |
{m,n} | 某個(gè)字符之后加{n,m} n表示最少出現(xiàn)多少次,最多m次 |
{m} | 正好出現(xiàn)m次 |
[root@K8S-Node3 ~]# egrep "^ba*c$" file
bc
baaaaaaaaaac
bac
[root@K8S-Node3 ~]#
[root@K8S-Node3 ~]# egrep "^ba?c$" file
bc
bac
[root@K8S-Node3 ~]#
[root@K8S-Node3 ~]# egrep "^ba+c$" file
baaaaaaaaaac
bac
[root@K8S-Node3 ~]#
[root@K8S-Node3 ~]# egrep "^ab{3}c$" file
abbbc
[root@K8S-Node3 ~]# egrep "^ab{3,7}c$" file
abbbbc
abbbc
abbbbbbbc
[root@K8S-Node3 ~]#
POSIX特殊字符
特殊字符 | 說(shuō)明 |
---|---|
[:alnum:] | 匹配任意字母字符0-9 a-z A-Z |
[:alpha:] | 匹配任意字母,大寫(xiě)或小寫(xiě) |
[:dight:] | 數(shù)字0-9 |
[:graph:] | 非空字符(不包括空格) |
[:lower:] | 小寫(xiě)字母a-z |
[:upper:] | 大寫(xiě)字母A-Z |
[:cntrl:] | 控制字符 |
[:print:] | 非空字符(包括空格) |
[:punct:] | 標(biāo)點(diǎn)符號(hào) |
[:blank:] | 空格和TAB字符 |
[:xdigit:] | 16進(jìn)制數(shù)字 |
[:space:] | 所有空白字符(新行,空格凡蚜,制表符) |
[root@K8S-Node3 ~]# egrep "^http[[:punct:]]{2}[[:punct:]]{2}[[:punct:]]{2}192.168.129.130.com$" file
http::**//192.168.129.130.com
[root@K8S-Node3 ~]# egrep "^[[:alpha:]]*.[1-6]{3}.com$" file
youngzheyuan@163.com
[root@K8S-Node3 ~]#
Shell對(duì)文件的操作
sed命令
語(yǔ)法:
sed [options]'{command}{flags}' [filename]
命令選項(xiàng)
-e script 將腳本中指定的命令添加到處理輸入時(shí)執(zhí)行的命令中 一行要有多個(gè)條件
-f script 將文件中指定的命令添加到處理輸入時(shí)執(zhí)行的命令中
-n 抑制自動(dòng)輸出
-i 編輯文件內(nèi)容
-i.bak 修改時(shí)同時(shí)創(chuàng)建 bak備份文件
-r 使用正則表達(dá)式
! 取反
sed常用命令
a 在匹配行后面添加
i 在匹配行前面添加
p 打印
d 刪除行
s 查找替換字符
c 更改行
y 轉(zhuǎn)換 N D P
flags
數(shù)字 表示新文本替換的模式
g: 表示用新文件替換現(xiàn)有文本的全部實(shí)例
p: 表示打印原始內(nèi)容
w filename: 將替換的結(jié)果寫(xiě)入文件
sed常用命令
a 在匹配行后面添加
i 在匹配行前面添加
p 打印
d 刪除行
s 查找替換字符
c 更改行
y 轉(zhuǎn)換 N D P
[root@K8S-Node3 ~]# sed 'a\hello world' date
1 abc
hello world
2 abc
hello world
3 abc
hello world
4 abc
hello world
5 abc
hello world
[root@K8S-Node3 ~]# sed '3a\hello world' date
1 abc
2 abc
3 abc
hello world
4 abc
5 abc
[root@K8S-Node3 ~]# sed '3i\hello world' date
1 abc
2 abc
hello world
3 abc
4 abc
5 abc
[root@K8S-Node3 ~]# sed '3,5i\hello world' date
1 abc
2 abc
hello world
3 abc
hello world
4 abc
hello world
5 abc
[root@K8S-Node3 ~]#
[root@K8S-Node3 ~]# sed '/3 abc/a\hello world' date
1 abc
2 abc
3 abc
hello world
4 abc
5 abc
[root@K8S-Node3 ~]# #//代表匹配模式 此條命令表示匹配 3 abc 在此行下添加 hello world
[root@K8S-Node3 ~]# sed -r '/(^#|#|^$)/d' nginx.conf #刪除以#開(kāi)頭或包含#或空行
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@K8S-Node3 ~]# sed '/3 abc/d date' #刪除 3 abc這行
[root@K8S-Node3 ~]# sed '3s/abc/cat/' date 更改第三行的abc為cat
1 abc
2 abc
3 cat
4 abc
5 abc
[root@K8S-Node3 ~]# sed 's/abc/cat/' date
1 cat
2 cat
3 cat
4 cat
5 cat
[root@K8S-Node3 ~]# sed '/3 abc/s/abc/cat/' date #匹配3 abc 更改 abc 為 cat
1 abc
2 abc
3 cat
4 abc
5 abc
[root@K8S-Node3 ~]#
[root@K8S-Node3 ~]# sed 'c\hello world' date
hello world
hello world
hello world
hello world
hello world
[root@K8S-Node3 ~]# sed '/3 abc/c\hello world' date
1 abc
2 abc
hello world
4 abc
5 abc
[root@K8S-Node3 ~]#
[root@K8S-Node3 ~]# sed 'y/abc/DZY/' date #與s類似
1 DZY
2 DZY
3 DZY
4 DZY
5 DZY
[root@K8S-Node3 ~]#
flags
數(shù)字 表示新文本替換的模式
g: 表示用新文件替換現(xiàn)有文本的全部實(shí)例
p: 表示打印原始內(nèi)容
w filename: 將替換的結(jié)果寫(xiě)入文件
[root@K8S-Node3 ~]# sed 's/abc/dog/' date #替換第一處
1 dog.abc
2 dog.abc
3 dog.abc
4 dog.abc
5 dog.abc
[root@K8S-Node3 ~]# sed 's/abc/dog/g' date #全部替換
1 dog.dog
2 dog.dog
3 dog.dog
4 dog.dog
5 dog.dog
[root@K8S-Node3 ~]# sed 's/abc/dog/2' date #替換指定處
1 abc.dog
2 abc.dog
3 abc.dog
4 abc.dog
5 abc.dog
命令選項(xiàng)
-e script 將腳本中指定的命令添加到處理輸入時(shí)執(zhí)行的命令中 一行要有多個(gè)條件(修改多處,用;分隔)
-f script 將文件中指定的命令添加到處理輸入時(shí)執(zhí)行的命令中
-n 抑制自動(dòng)輸出
-i 編輯文件內(nèi)容
-i.bak 修改時(shí)同時(shí)創(chuàng)建 bak備份文件
-r 使用正則表達(dá)式
! 取反
默認(rèn)不加參數(shù)的情況下,sed是修改內(nèi)存中文件內(nèi)容,并不直接修改文本內(nèi)容
[root@K8S-Node3 ~]# sed 's/abc/dog/p' date #-n
1 dog.abc
1 dog.abc
2 dog.abc
2 dog.abc
3 dog.abc
3 dog.abc
4 dog.abc
4 dog.abc
5 dog.abc
5 dog.abc
[root@K8S-Node3 ~]# sed -n 's/abc/dog/p' date
1 dog.abc
2 dog.abc
3 dog.abc
4 dog.abc
5 dog.abc
[root@K8S-Node3 ~]#
-e script 將腳本中指定的命令添加到處理輸入時(shí)執(zhí)行的命令中 一行要有多個(gè)條件(修改多處,用;分隔)
[root@K8S-Node3 ~]# sed -e 's/abc/dog/;s/efg/cat/' date
1 dog.abc.cat
2 dog.abc.cat
3 dog.abc.cat
4 dog.abc.cat
5 dog.abc.cat
-f script 將文件中指定的命令添加到處理輸入時(shí)執(zhí)行的命令中(指定sed命令行文件)
[root@K8S-Node3 ~]# cat xx
s/abc/dog/g
s/efg/cat/
[root@K8S-Node3 ~]# sed -f xx date
1 dog.dog.cat
2 dog.dog.cat
3 dog.dog.cat
4 dog.dog.cat
5 dog.dog.cat
[root@K8S-Node3 ~]# sed -i -r 's/[[:alnum:]]{3}/zxc/' date
[root@K8S-Node3 ~]# cat date
1 zxc.asd.asd
1 zxc.asd.asd
2 zxc.asd.asd
2 zxc.asd.asd
3 zxc.asd.asd
3 zxc.asd.asd
4 zxc.asd.asd
4 zxc.asd.asd
5 zxc.asd.asd
5 zxc.asd.asd
sed -i.bak 's/ac/ab/' files
[root@K8S-Node3 ~]# cat file.bak | grep ac
ac
accc
acs
acs
ac
baaaaaaaaaac
bac
[root@K8S-Node3 ~]# cat file | grep ac
[root@K8S-Node3 ~]# cat file | grep ab
ab
abcc
abs
abs
ab
aaaaabbbc
abbccccc
baaaaaaaaaab
bab
awk
awk語(yǔ)法
awk [options] [BEGIN] {program} [END] [file]
-F 指定分隔符 默認(rèn)為空格
-f file 指定讀取程序的文件名
-v var=value 定義awk程序中使用的變量和默認(rèn)值
BEGIN:再開(kāi)始處理數(shù)據(jù)流之前執(zhí)行 可選項(xiàng)
program:如何處理數(shù)據(jù)流 必選項(xiàng)
END:處理數(shù)據(jù)流之后執(zhí)行 可選項(xiàng)
awk對(duì)字段(列)的提取
$0:表示整行文本
$1:表示第一列
$2:表示第二列
$3:表示第三列
$N:表示第N列
$NF:表示最后一列
[root@K8S-Node3 ~]# awk '{print $1}' test
abc
abc
abc
abc
abc
[root@K8S-Node3 ~]# awk '{print $2}' test
def
def
def
def
def
[root@K8S-Node3 ~]# awk '{print $NF}' test
yz
yz
yz
yz
yz
awk提取記錄(行)
使用NR指定行數(shù)
[root@K8S-Node3 ~]# free -m
total used free shared buff/cache available
Mem: 3770 869 2150 19 751 2668
Swap: 0 0 0
[root@K8S-Node3 ~]# free -m | awk 'NR==2{print $2}'
3770
#提取第二行的第二列數(shù)據(jù)
[root@K8S-Node3 ~]# cat passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
jenkins:x:998:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false
gitlab-www:x:997:993::/var/opt/gitlab/nginx:/bin/false
git:x:996:992::/var/opt/gitlab:/bin/sh
gitlab-redis:x:995:991::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:994:990::/var/opt/gitlab/postgresql:/bin/sh
registry:x:993:989::/var/opt/gitlab/registry:/bin/sh
gitlab-prometheus:x:992:988::/var/opt/gitlab/prometheus:/bin/sh
user2:x:1000:1000::/home/user2:/bin/bash
user4:x:1001:1001::/home/user4:/bin/bash
user8:x:1002:1002::/home/user8:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
user10:x:1004:1004::/home/user10:/bin/bash
user1:x:1005:1005::/home/user1:/bin/bash
user9:x:1006:1006::/home/user9:/bin/bash
user7:x:1007:1007::/home/user7:/bin/bash
user5:x:1008:1008::/home/user5:/bin/bash
user6:x:1009:1009::/home/user6:/bin/bash
[root@K8S-Node3 ~]# awk -F ":" 'NR==2 {print $1}' passwd #指定列分隔符為:答應(yīng)第二 行第一列的數(shù)據(jù)
bin
[root@K8S-Node3 ~]# awk -F ":" 'NR==2 {print $1,$3,$5}' passwd
bin 1 bin #打印多列之間用,隔開(kāi)
[root@K8S-Node3 ~]# awk -F ":" 'NR==2 {print $1 "-" $3 "-" $5}' passwd
bin-1-bin #表示打印多列,列數(shù)據(jù)間用-隔開(kāi)
[root@K8S-Node3 ~]# awk -F ":" 'NR==2 {print "account "$1, "UID "$3,"DESC "$5}' passwd
account bin UID 1 DESC bin #給打印出來(lái)的列數(shù)據(jù)加上自定義描述awk '{print "str"$N,"str"$N}'
awk高級(jí)用法
awk定義變量
MemTotal: 3861364 kB
MemFree: 2150092 kB
You have new mail in /var/spool/mail/root
[root@K8S-Node3 ~]# head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print t-f*100/t "%"}'
3.86131e+06%
[root@K8S-Node3 ~]# head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t "%"}'
44.3248% #與print之間要用;隔開(kāi)
awk定義數(shù)組(字典)
[root@K8S-Node3 ~]# awk 'BEGIN{dzy[0]=1;dzy[1]=2;print dzy[0],dzy[1]}'
1 2
awk運(yùn)算
比較運(yùn)算 > >= < <= == !=
數(shù)學(xué)運(yùn)算 + - * 人断、 % ** ++ --
邏輯運(yùn)算 && ||
匹配運(yùn)算 ~ !~ 模糊匹配 == !=屬于精確匹配
如果是字符則用ascli編碼順序表比較,如果返回值為1代表真 為0代表假
[root@K8S-Node3 ~]# awk '$1>5{print $0}' test #此語(yǔ)句類似加入了判斷,當(dāng)?shù)谝涣凶侄?gt;5 則打印否則 不打印
6
7
8
9
[root@K8S-Node3 ~]# awk '$1>=5{print $0}' test
5
6
7
8
9
[root@K8S-Node3 logs]# du -k * | awk '$1<8{print $0}' | awk '{print $2}'
access.log
數(shù)學(xué)運(yùn)算
[root@K8S-Node3 ~]# du -k * | awk 'NR==2{dzy[0]=$1}NR==3{dzy[1]=$1;print dzy[0]+dzy[1]}'
8
[root@K8S-Node3 ~]# du -k * | awk 'NR==3{a=$1}NR==4{b=$1;print a+b}'
1492
[root@K8S-Node3 ~]# du -k * | awk 'NR==3{a=$1}NR==4{b=$1;print a*b}'
5952
[root@K8S-Node3 ~]# du -k * | awk 'NR==3{a=$1}NR==4{b=$1;print a/b}'
0.00268817
[root@K8S-Node3 ~]# du -k * | awk 'NR==3{a=$1}NR==4{b=$1;print a/b*100 "%"}'
0.268817%
[root@K8S-Node3 ~]# du -k * | awk 'NR==3{a=$1}NR==4{b=$1;print a-b}'
-1484
awk環(huán)境變量
變量 | 描述 |
---|---|
FIELDWIDTHS | 定義每個(gè)數(shù)據(jù)字段的寬度 |
FS | 指定數(shù)據(jù)源字段分隔符(列) |
OFS | 輸出字段分隔符(列) |
RS | 輸入記錄分隔符(行) |
ORS | 輸出記錄分隔符(行) |
[root@K8S-Node3 ~]# awk -F ":" 'BEGIN{FIELDWIDTHS="2 4 5"}NR==1{print $1,$2,$3}' passwd
ro ot:x :0:0:
[root@K8S-Node3 ~]# awk 'BEGIN{FS=":"}NR==1{print $1,$2,$3}' passwd
root x 0 #指定數(shù)據(jù)源字段分隔符
[root@K8S-Node3 ~]# awk -F ":" 'BEGIN{OFS="@"}NR==1{print $1,$2,$3}' passwd
root@x@0 #指定打印輸出分隔符
[root@K8S-Node3 ~]# awk 'BEGIN{FS=":";OFS="@"}NR==1{print $1,$2,$3}' passwd
root@x@0 #FS OFS 結(jié)合使用
[root@K8S-Node3 ~]# awk 'BEGIN{RS="\n"}{print $1,$2,$3}' test
1
2
3
4
5
6
7
8
9
You have new mail in /var/spool/mail/root
[root@K8S-Node3 ~]# awk 'BEGIN{RS=""}{print $1,$2,$3}' test
1 2 3
#指定數(shù)據(jù)源的行分隔符 默認(rèn)為回車 當(dāng)設(shè)置為""的時(shí)候則 行=列 即awk將文件讀入內(nèi)存時(shí) 1
2
3
變?yōu)? 1 2 3
[root@K8S-Node3 ~]# awk 'BEGIN{RS="";OFS="\n"}{print $1,$2,$3}' test
1
2
3
#注意看 此時(shí)輸出列分隔符為"\n"
[root@K8S-Node3 ~]# awk 'BEGIN{RS="";ORS="@@@"}{print $1,$2,$3}' test
1 2 3@@@[root@K8S-Node3 ~]#
#此時(shí)行分隔符為@@@
awk流程控制
[root@K8S-Node3 ~]# awk '{if ($1<5) print $1*2;else print $1/2'} test
2
4
6
8
2.5
3
3.5
4
4.5
或者
[root@K8S-Node3 ~]# awk '{
if ($1<5)
print $1*2
else
print $1/2
}' test
2
4
6
8
2.5
3
3.5
4
4.5
for語(yǔ)句
[root@K8S-Node3 ~]# awk '{
> for (i=1;i<4;i++)
> sum+=$i
> print sum}' num
300
900
1800
[root@K8S-Node3 ~]# awk '{for(i=1;i<4;i++)(sum+=$i);print sum}' num
300
900
1800
while語(yǔ)句
[root@K8S-Node3 ~]# awk '{
sum=0
i=1
while (i<4) {
sum+=$i
i++
}
print sum
}' num
300
600
900
[root@K8S-Node3 ~]# awk '{sum=0;i=1;while (i<4){sum+=$i;i++};print sum}' num
300
600
900
awk小技巧
awk 'END{print NR}' 打印行數(shù)
awk 'END{print $0}' 打印最后一行
awk 'END{print NF}' 打印列數(shù)
腳本實(shí)例
mktemp port_status.XXX 創(chuàng)建臨時(shí)文件
mktemp -d port_status.XXX 創(chuàng)建臨時(shí)文件夾