Shell基礎(chǔ)語(yǔ)法

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靶病。 [ a =b ] 返回 false。
!= 檢測(cè)兩個(gè)字符串是否相等口予,不相等返回 true娄周。 [ a !=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í)文件夾

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吭从,一起剝皮案震驚了整個(gè)濱河市朝蜘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涩金,老刑警劉巖谱醇,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異步做,居然都是意外死亡副渴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)全度,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)煮剧,“玉大人,你說(shuō)我怎么就攤上這事将鸵∶阒眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵顶掉,是天一觀的道長(zhǎng)草娜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)痒筒,這世上最難降的妖魔是什么宰闰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任茬贵,我火速辦了婚禮,結(jié)果婚禮上移袍,老公的妹妹穿的比我還像新娘解藻。我一直安慰自己,他們只是感情好咐容,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布舆逃。 她就那樣靜靜地躺著,像睡著了一般戳粒。 火紅的嫁衣襯著肌膚如雪路狮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天蔚约,我揣著相機(jī)與錄音奄妨,去河邊找鬼。 笑死苹祟,一個(gè)胖子當(dāng)著我的面吹牛砸抛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播树枫,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼直焙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了砂轻?” 一聲冷哼從身側(cè)響起奔誓,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搔涝,沒(méi)想到半個(gè)月后厨喂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庄呈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蜕煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诬留。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斜纪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出文兑,到底是詐尸還是另有隱情盒刚,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布彩届,位于F島的核電站伪冰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏樟蠕。R本人自食惡果不足惜贮聂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一靠柑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吓懈,春花似錦歼冰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至甘穿,卻和暖如春腮恩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背温兼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工秸滴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人募判。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓荡含,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親届垫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子释液,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • shell不是面向?qū)ο笳Z(yǔ)言 變量 shell中賦值的變量值全部為字符串,不存在數(shù)字類型 變量分類全局變量 ≈ 環(huán)...
    tom__zhu閱讀 59評(píng)論 0 1
  • Shell變量 Shell中的變量比較簡(jiǎn)單装处,不需要聲明误债。并且只有一種類型:String》危可以直接賦值找前,需要注意的是...
    Jaesoon閱讀 288評(píng)論 0 0
  • 一糟袁、變量賦值判族,變量傳參 定義變量 -- 字母 readonly 變量只讀(不可改變值) unset(刪除變量...
    績(jī)重KF閱讀 1,291評(píng)論 0 1
  • 循環(huán) 條件判斷 數(shù)組 變量的引用 函數(shù)調(diào)用 平時(shí)開(kāi)發(fā)過(guò)程中,Shell復(fù)雜腳本用的并不多项戴, 如果真的很復(fù)雜形帮,完全可...
    Alien的小窩閱讀 540評(píng)論 0 0
  • 搬運(yùn) 一、主要內(nèi)容 shell編程 sed命令 awk命令 crontab定時(shí)器 二周叮、簡(jiǎn)介 Shell是用戶與內(nèi)核...
    帥可兒妞閱讀 444評(píng)論 0 1