主頁 > 作業系統 > shell命令大全筆記

shell命令大全筆記

2020-10-08 17:23:12 作業系統

篇幅有點長,但是認真看完對你是有很大幫助,

## -print 將匹配的檔案輸出到標準輸出
## -exec 將匹配的檔案執行該引數所給出的shell命令
## -ok 將匹配的檔案執行該引數所給出的shell命令,每次執行命令有提示

#-------------------------------------------------------------
find /etc -name passwd -exec rm {} \; ## {} \;中間有空格,不提示

find /etc -name passwd -ok rm {} \; ## {} \;中間有空格,每次洗掉都提示
#-------------------------------------------------------------


## -prune 不在指定的目錄中查找,不可以與-depth選項連用
案例一:查找/home目錄下所有的.sh結尾的檔案,忽略/home/ab目錄
注意:不可以寫成-path '/home/ab/' ; 要注意此命令的路徑寫法,要不同為絕對路徑,要不同為相對路徑;否則就為錯誤

[root@localhost home]# find /home -path '/home/ab' -prune -o -name '*.sh' -print
/home/t1.sh
/home/t2.sh
/home/t3.sh
/home/t4.sh
/home/t5.sh
/home/t6.sh
/home/t7.sh
/home/t8.sh
/home/t9.sh
[root@localhost home]# find . -path './ab' -prune -o -name '*.sh' -print
./t1.sh
./t2.sh
./t3.sh
./t4.sh
./t5.sh
./t6.sh
./t7.sh
./t8.sh
./t9.sh
[root@localhost home]#
#################################################################################
案例二:在除dir0、dir1及子目錄以外的目錄下查找txt后綴檔案

find ./ \( -path './dir0*' -o -path './dir1*' \) -a -prune -o -name *.txt -print

注意:圓括號()表示此處是一個復合運算式,它告訴 shell 不對圓括號里面的字符作特殊解釋,而留給 find 命令去解釋其意義,由于命令列不能直接使用圓括號,所以需要用反斜杠’\’進行轉意,一定要注意’(‘,’)’左右兩邊都需空格,
#################################################################################
案例三: 在dir0、dir1及子目錄下查找txt后綴檔案

find ./ \( -path './dir0*' -o -path './dir1*' \) -a -name *.txt -print
---------------------

-perm 按照檔案權限來查找檔案
-mtime -n 檔案更改時間距離現在n天以內
-mtime +n 檔案更改時間距離現在n天以前
-atime
-ctime
---------------------
xargs -exec 區別
-exec: 對傳遞給exec執行的檔案長度有限制;對處理的每一個匹配到的檔案發起一個行程.
xargs: 每次只獲取一部分檔案而不是全部檔案,對處理的所有檔案只有一個行程
---------------------------
案例一:
[root@localhost home]# ls
a ab jack t1.sh t2.sh t3.sh t4.sh t5.sh t6.sh t7.sh t8.sh t9.sh
[root@localhost home]# find /home -name "*.sh" | xargs chmod 777 ##對匹配到的檔案統一授權
[root@localhost home]# find /home -name "*.sh" -exec chmod 000 {} \; ##對匹配到的檔案統一授權

################
后臺執行命令
################
atq 查詢后臺執行的命令
atrm 洗掉后臺執行的命令
nohup 行程在退出帳戶時該行程還不會結束,可以使用此命令
格式: nohup command &
[root@localhost home]# nohup ping 127.0.0.1 &
[2] 11319
[root@localhost home]# nohup: 忽略輸入并把輸出追加到"nohup.out"
[root@localhost home]# ls nohup.out
nohup.out
[root@localhost home]# jobs -l #查看后臺運行的行程
[2]+ 11319 運行中 nohup ping 127.0.0.1 &
[root@localhost home]#
################
檔案名置換
################

[...] 匹配[]中所含有的任何字符
[!...] 匹配[]中非感嘆號!之后的字符

echo命令有很多功能,使用的時候需要加選項"-e"; 最常用的是下面幾個:
\\ 反斜線
\a 報警符(BEL)
\b 退格符
\c 禁止尾隨的換行符
\f 換頁符
\n 換行符
\r 回車符
\t 水平制表符
\v 縱向制表符
-n 不輸出行尾的換行符.
-e 允許對下面列出的加反斜線轉義的字符進行解釋.

案例一:
echo -e "what is your name: \c"
read name
echo 你的名字是:$name
等價于
echo -n "what is your name:"
read name
echo 你的名字是:$name


## read 命令
語法: read varible1 varible2 ...
案例一: 執行時一次性需要輸入2個引數
echo -n "輸入你的名字和別名: "
read name alia
echo 你的名字是:$name 你的別名是: $alia

## tee 命令
把輸出的一個副本輸送到標準輸出,另一個
副本拷貝到相應的檔案中,
tee -a files # -a表示追加到檔案末尾
案例一: 將檔案追加到nohup.out末尾
[root@localhost home]# head -4 /etc/passwd | tee -a nohup.out

command 1> filename #把標準輸出重定向到一個檔案中
command 1> filename 2>&1 #把標準輸出和標準錯誤重定向到一個檔案中

案例一: 將錯誤檔案和正確檔案輸出到filename
cat>>filename 2>&1<<EOF
EOF

## exec命令
exec使用當前shell,沒有開啟子shell,執行的時候所有的環境
都將會被清除,并重新啟動一個shell;執行完畢后關閉shell

################
命令執行順序
################
(命令1;命令2;....) 在當前shell中執行
{命令1;命令2;....} 在當前子shell中執行

################
正則運算式
################
pattern\n{n\} 用來匹配前面pattern出現次數,n為次數
pattern\{n,\} 用來匹配前面pattern至少為n次
pattern\{n,m\} 用來匹配前面pattern出現次數為n與m次之間
#-----------------------------------------------------
案例一:
0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 4 \ } ##對日期格式d d - m m - y y y y
[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } ##對I P地址格式nnn. nnn.nnn.nnn
[ ^ . * $ ] ##對匹配任意行
#-----------------------------------------------------

sort 默認按照第一列進行排序操作,以空格進行分割
sort -t (設定分隔符)和-k (指定某列) filename
########
案例:
1. 指定冒號為分隔符,按照第四列排序
sort -t: -g -k4 /etc/passwd

2. -g表示以數值型別排序,默認按照字串型別,即把數值當做字串來比對
[root@localhost ~]# sort -t: -g -k3 passwd #-g選項,按照常規數值排序
[root@localhost ~]# sort -t: -n -k3 passwd #-n選項,按照字串數值排序
[root@localhost ~]# sort -t: -k3 passwd #把第三列作為常規型別排序,會2大于10型別的錯誤

3. -u 洗掉重復的內容
[root@localhost ~]# ls -l /etc | awk '{print $5}' | wc -l
292
[root@localhost ~]# ls -l /etc | awk '{print $5}' | sort -u |wc -l #sort -u去重
184
[root@localhost ~]#

##uniq的重復表示行連續重復,而sort -u的重復則對所有行來說
案例一:
[root@localhost ~]# uniq -c aa #顯示aa檔案中出現連續重復的行的次數
2 test
1 admin
1 test
1 jack
1 liu
3 test
[root@localhost ~]#

[root@localhost ~]# uniq -d aa #顯示重復出現的行
test
test
aa
vm

[root@localhost ~]# uniq -f2 aa #查看第二域,忽略第一域,查看有重復的項
test aa
[root@localhost ~]#

##cut 剪切列或域
-d #指定與空格和Tab鍵不同的域分隔符
-f1,5 #剪切第1域,第5域

################################
paste:
-d #連接2個檔案的連接分隔符,例如-d@

[root@localhost ~]# paste aa bb #將2個檔案按照行合并
aroot admin docker aa
aroot admin oa bb
aroot admin
aroot admin
jack public
[root@localhost ~]#

#第一個檔案作為第一行,第二個作為第二行
[root@localhost ~]# paste -s aa bb
aroot admin aroot admin aroot admin aroot admin jack public
docker aa oa bb
[root@localhost ~]#

#以空格進行分割,每行只顯示2列內容
[root@localhost ~]# ls /etc | paste -d" " - -


################
登錄環境
################
用戶登錄時,自動讀取/etc目錄下profile檔案,此檔案包含:
? 全域或區域環境變數,
? PATH資訊,
? 終端設定,
? 安全命令,
? 日期資訊或放棄操作資訊,

stty用于設定終端特性.
stty -a #查看終端現在的stty選項
[root@localhost ~]# stty -a
speed 38400 baud; rows 28; columns 143; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

#############################
案例一: 避免鍵盤上輸入錯誤無法洗掉
#!/bin/bash
echo -n "請輸入你的名字:"
stty erase '^H' #避免鍵盤上輸入錯誤無法洗掉
read name
echo 你的名字為: $name
###########################
案例二:關倍訓顯功能
#!/bin/bash
#將終端特性保存為一個變數
savestty=`stty -g`
#更改終端特性echo
stty cbreak -echo
stty -a
echo -e "\nGive me that passwd: \c"
read passwd
echo -e "\nyou password is $passwd"
#恢復終端特性為保存的變數
stty $savestty
[root@localhost ~]#
#-----------------------------------------------------------------------
################
環境變數
################

unset 清除變數
set 查看所有本地定義的shell變數
${變數名:-變數值} #如果未初始化則使用花括號里面的變數值
#################################
#!/bin/bash
aab=vmsys
echo ${aab:-redhat} #如果變數沒有設定初始值,則變數值為redhat
#################################

[root@localhost ~]# more ab.sh
#!/bin/bash
aab=vmsys
echo 變數內容為:${aab:-redhat} #如果變數沒有設定初始值,則變數值為redhat
#------------- ------------------------------
color=blue
echo "未清除變數內容為: ${color:-grey}"
unset color #清除變數后,變數值為花括號里面內容
echo "清除后變數內容為: ${color:-grey}"

[root@localhost ~]# sh ab.sh
變數內容為:vmsys
未清除變數內容為: blue
清除后變數內容為: grey
[root@localhost ~]#
################
案例三:
#!/bin/bash
echo -n "what time do you wish to start the payrool: [03:00] "
read TIME
echo "process to start at ${TIME:=03:00} ok"

echo -n "is it a monthly or weekly run [weekly]"
read RUN_TYPE
echo "Run type is ${RUN_TYPE:=weekly}"
at -f $RUN_TYPE $TIME #-f表示一次性計劃任務從檔案讀取

####
案例四: 提示資訊自己定義的內容 ${變數名:? "提示內容..."}
echo "the file is ${files:? "sorry cannot locate the variable files"}"
[root@localhost ~]#

案例五:
#echo ${var0?jack} #未定義變數var0,則顯示自定義的提示字串jack

#echo ${var1:?jack} #未定義變數var1,則顯示自定義的提示字串jack

#echo ${var2:-jack} #沒有設定var2的時候,后續echo $var2為空,當前${var2:-jack}代碼顯示為jack,屬于一種替換操作!

#echo ${var3:=jack} #沒有定義var3自動設定var3=jack;如果設定了變數就使用定義的
###########################################################################
測驗變數是否取值,如果未設定,則回傳一空串,方法如下:
$ { v a r i a b l e : + v a l u e }
案例1:
abc=100
echo ${abc+`route add default gw 172.16.38.254`} #如果沒有定義變數abc就顯示為空,定義了就執行后面命令

#######################################
在腳本中呼叫另一腳本(這實際上創建了一個子行程)

在一個腳本呼叫另外一個腳本需要設定PATH環境變數,并且還需要export匯出;
案例一:
[root@localhost ~]# more father
#!/bin/bash
PATH=$PATH:/root
export PATH
echo "This is the father"
FILM="A few good Men"
echo "I like the film: $FILM"
export FILM

echo ------------------------------
child
echo "back to father"
echo "and the film is: $FILM"
[root@localhost ~]# more child
#!/bin/bash
echo "called from father.. i am the child"
echo "film name is: $FILM"
FILM="DIE HARD"
echo "changing film to: $FILM"
[root@localhost ~]#


###############

$# 傳遞到腳本的引數個數
$* 以一個單字串顯示所有向腳本傳遞的引數
$$ 腳本運行的當前行程ID號
$! 后臺運行的最后一個行程的行程ID號
$@ 與$#相同,但是使用是要加上引號
$- 顯示shell使用的當前選項,與set命令功能相同


[ -r filename -a -w filename ] #檔案filename可讀可寫
或者
[ -r filename ] && [ -w filename ]
#######################################

字串型別:
= 字串相等
!= 字串不等
-z 空串
-n 非空串
---------------------------------------
#############
流控制部分
#############
#!/bin/bash
echo "`basename $0`" #表示執行的變數本身

####################################

>&2 也就是把結果輸出到和標準錯誤一樣


###將每行做為一個單變數輸入到line
#!/bin/bash
while read line
do
echo $line
done< filename.txt

#--------------------------------------------
#!/bin/bash
#root x 0 0 root /root /bin/bash
#bin x 1 1 bin /bin /sbin/nologin
###################################################
save_ifs=$IFS #保存默認分隔符
IFS=: #設定分隔符為冒號
while read A B C D E F G #讀取七個變數
do
echo -e "$A\t$B\t$C\t$D\t$E\t$F\t$G\t" #設定分隔符為\t
done < /etc/passwd
IFS=$save_ifs #恢復默認分隔符
#----------------------------------------------
total=`expr ${total:=0} + ${items:=100}`

#####################
read每次讀取2條記錄
#------------
#!/bin/bash
while read rec1
do
read rec2
echo "one:"$rec1
echo "two:"$rec2
echo ------------------------------
done</etc/passwd
################################################
#當為數字的時候awk回傳為1
[root@localhost ~]# echo 22 | awk '{if($0~/[^a-z A-Z]/) print "1"}'
1
[root@localhost ~]#

# 不能含有空格或者字母,否則回傳1
[root@localhost ~]# echo 22 2 | awk '{if($0~/[a-zA-Z ]/) print "1"}'
1
[root@localhost ~]#
#-----------------------------------
do
{陳述句}
while(條件)

例子:
[chengmo@localhost nginx]# awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(i<=100)
print total;
}'

結果: 5050

#!/bin/bash
read -p "請輸入內容: " var
aa=`echo $var | awk '{if($0~/[a-zA-Z]/) print "1";else if($0~/[0-9]/) print "2"}'`
echo $aa

 

## shfit 向左偏移一位
#!/bin/bash

while [ $# -ne 0 ]
do
echo $1
shift
done
~
###########################
擴展AWK
###########################
1.
[root@localhost ~]# awk '(/^root/) {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# awk '/^root/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#

2. NF表示讀取的域數
[root@localhost ~]# awk 'BEGIN{FS=":"} /^root/ {print $1,$NF}' /etc/passwd
root /bin/bash
[root@localhost ~]#

3.NR表示讀取的記錄數
[root@localhost ~]# awk 'BEGIN{FS=":"} /^root/ {print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
[root@localhost ~]#

4.OFS="##" 輸出字串使用##
[root@localhost ~]# awk 'BEGIN{FS=":";OFS="##"} /^root/ {print NR,$1,$NF}' /etc/passwd
1##root##/bin/bash
[root@localhost ~]#


5.設定輸出欄位分隔符(OFS使用方法)

[chengmo@localhost ~]$ awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
1^^root^^/bin/bash

6.設定輸出行記錄分隔符(ORS使用方法)
[chengmo@localhost ~]$ awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin
從上面看,ORS默認是換行符,這里修改為:”^^”,所有行之間用”^^”分隔了,

7.ARGC得到所有輸入引數個數,ARGV獲得輸入引數內容,是一個陣列
[root@localhost ~]# awk 'BEGIN{FS=":"; print "ARGC="ARGC; for(k in ARGV) {print k"=" ARGV[k];} } ' /etc/passwd ADMIN JACK
ARGC=4
0=awk
1=/etc/passwd
2=ADMIN
3=JACK
[root@localhost ~]#

8.獲取環境變數;ENVIRON是子典型陣列,可以通過對應鍵值獲得它的值,
[root@localhost ~]#
[root@localhost ~]# awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#
[root@localhost ~]#

9.格式如:awk ‘{action}’ 變數名=變數值 ,這樣傳入變數,可以在action中獲得值, 注意:變數名與值放到’{action}’后面
[root@localhost ~]# aa='bdqn jack'
[root@localhost ~]#
[root@localhost ~]# echo | awk '{print aa}' aa="$aa"
bdqn jack
[root@localhost ~]#

10.只需要呼叫:awk內置變數 ENVIRON,就可以直接獲得環境變數,它是一個字典陣列,環境變數名 就是它的鍵值,
awk 'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}'

11.true就回傳1,false回傳0
awk邏輯運算子
[chengmo@localhost ~]$ awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}'
0 1

12. ?:運算子
[chengmo@localhost ~]$ awk 'BEGIN{a="b";print a=="b" ? "ok":"err";}'
ok
[root@localhost ~]# awk 'BEGIN{a="b";print a!="b" ? "ok":"err";}'
err

13. in運算子;in運算子,判斷陣列中是否存在該鍵值
[chengmo@localhost ~]$ awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'
0

[chengmo@localhost ~]$ awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
1
in運算子,判斷陣列中是否存在該鍵值

14.只需要將變數通過”+”連接運算,自動強制將字串轉為整型,非數字變成0,發現第一個非數字字符,后面自動忽略,10test10忽略后面的test10變成==>>10
[chengmo@centos5 ~]$ awk 'BEGIN{a="100";b="10test10";print (a+b+0);}'
110

15.awk數字轉為字串
[chengmo@centos5 ~]$ awk 'BEGIN{a=100;b=100;c=(a""b);print c}'
100100
只需要將變數與””符號連接起來運算即可

16.
[chengmo@centos5 ~]$ awk 'BEGIN{a="a";b="b";c=(a""b);print c}'
ab

[chengmo@centos5 ~]$ awk 'BEGIN{a="a";b="b";c=(a+b);print c}'
0
字串連接操作通”二“,”+”號運算子,模式強制將左右2邊的值轉為 數字型別,然后進行操作,

17.陣列的使用;split為分割字串為陣列
[root@localhost ~]# awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA), tA[1],tA[2];}'
4 it is
[root@localhost ~]#
[chengmo@localhost ~]$ awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}'
4
asort對陣列進行排序,回傳陣列長度,

18. 回圈列印陣列
[chengmo@localhost ~]$ awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'
4 test
1 it
2 is
3 a

for…in 輸出,因為陣列是關聯陣列,默認是無序的,所以通過for…in 得到是無序的陣列,如果需要得到有序陣列,需要通過下標獲得,
[chengmo@localhost ~]$ awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
1 it
2 is
3 a
4 test

注意:陣列下標是從1開始,與c陣列不一樣,

19.判斷陣列
正確判斷方法:
[chengmo@localhost ~]$ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'
a a1
b b1

if(key in array) 通過這種方法判斷陣列中是否包含”key”鍵值,

 

20.洗掉鍵值:
[chengmo@localhost ~]$ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'
b b1

delete array[key]可以洗掉,對應陣列key的,序列值

21. 多重嵌套,每條命令陳述句后面可以用“;”號結尾
awk 'BEGIN{
test=100;
if(test>90)
{
print "very good";
}
else if(test>60)
{
print "good";
}
else
{
print "no pass";
}
}'

22.
awk 'BEGIN{
test=100;
total=0;
while(i<=test)
{
total+=i;
i++;
}
print total;
}'
5050

23. for回圈
for回圈有兩種格式:
格式1:
for(變數 in 陣列)
{陳述句}

格式2:
for(變數;條件;運算式)
{陳述句}

案例:
awk 'BEGIN{
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}'
#------------------
awk 'BEGIN{
total=0;
for(i=0;i<=100;i++)
{
total+=i;
}
print total;
}'

5050


24.do回圈
格式:
do
{陳述句}while(條件)

案例:
awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(i<=100)
print total;
}'
5050

## 案例:將具有字串 ae 或 alle 或 anne 或 allnne 的所有記錄列印至標準輸出
在正則運算式中將字串組合在一起,命令列:
awk '/a(ll)?(nn)?e/' testfile

## 內置函式:

#+ 表示匹配前面的子運算式一次或多次,要匹配 + 字符,請使用 \+

awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!
#-------------------------------------------------------------------------------
gsub( Ere, Repl, [ In ] ) 除了正則運算式所有具體值被替代這點,它和 sub 函式完全一樣地執行,,

sub( Ere, Repl, [ In ] ) 用 Repl 引數指定的字串替換 In 引數指定的字串中的由 Ere 引數指定的擴展正則運算式的第一個具體值,
sub 函式回傳替換的數量,出現在 Repl 引數指定的字串中的 &(和符號)由 In 引數指定的與 Ere 引數的
指定的擴展正則運算式匹配的字串替換,如果未指定 In 引數,預設值是整個記錄($0 記錄變數),

index( String1, String2 ) 在由 String1 引數指定的字串(其中有出現 String2 指定的引數)中,回傳位置,從 1 開始編號,
如果 String2 引數不在 String1 引數中出現,則回傳 0(零),

length [(String)] 回傳 String 引數指定的字串的長度(字符形式),如果未給出 String 引數,則回傳整個記錄的長度($0 記錄變數),

blength [(String)] 回傳 String 引數指定的字串的長度(以位元組為單位),如果未給出 String 引數,則回傳整個記錄的長度($0 記錄變數),

substr( String, M, [ N ] ) 回傳具有 N 引數指定的字符數量子串,子串從 String 引數指定的字串取得,其字符以 M 引數指定的位置開始,
M 引數指定為將 String 引數中的第一個字符作為編號 1,如果未指定 N 引數,則子串的長度將是 M 引數指定的位置到 String 引數的末尾 的長度,

match( String, Ere ) 在 String 引數指定的字串(Ere 引數指定的擴展正則運算式出現在其中)中回傳位置(字符形式),
從 1 開始編號,或如果 Ere 引數不出現,則回傳 0(零),RSTART 特殊變數設定為回傳值,RLENGTH 特殊變數設定為匹配的字串的長度,或如果未找到任何匹配,則設定為 -1(負一),

split( String, A, [Ere] ) 將 String 引數指定的引數分割為陣列元素 A[1], A[2], . . ., A[n],并回傳 n 變數的值,
此分隔可以通過 Ere 引數指定的擴展正則運算式進行,或用當前欄位分隔符(FS 特殊變數)來進行(如果沒有給出 Ere 引數),除非背景關系指明特定的元素還應具有一個數字值,否則 A 陣列中的元素用字串值來創建,

tolower( String ) 回傳 String 引數指定的字串,字串中每個大寫字符將更改為小寫,大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義,

toupper( String ) 回傳 String 引數指定的字串,字串中每個小寫字符將更改為大寫,大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義,

sprintf(Format, Expr, Expr, . . . ) 根據 Format 引數指定的 printf 子例程格式字串來格式化 Expr 引數指定的運算式并回傳最后生成的字串,

#################################################
格式化字串輸出(sprintf使用)
格式化字串格式:
其中格式化字串包括兩部分內容: 一部分是正常字符, 這些字符將按原樣輸出; 另一部分是格式化規定字符, 以"%"開始, 后跟一個或幾個規定字符,用來確定輸出內容格式,

格式符 說明
%d 十進制有符號整數
%u 十進制無符號整數
%f 浮點數
%s 字串
%c 單個字符
%p 指標的值
%e 指數形式的浮點數
%x %X 無符號以十六進制表示的整數
%o 無符號以八進制表示的整數
%g 自動選擇合適的表示法
###############################################

函式名 說明
atan2( y, x ) 回傳 y/x 的反正切,
cos( x ) 回傳 x 的余弦;x 是弧度,
sin( x ) 回傳 x 的正弦;x 是弧度,
exp( x ) 回傳 x 冪函式,
log( x ) 回傳 x 的自然對數,
sqrt( x ) 回傳 x 平方根,
int( x ) 回傳 x 的截斷至整數的值,
rand( ) 回傳任意數字 n,其中 0 <= n < 1,
srand( [Expr] ) 將 rand 函式的種子值設定為 Expr 引數的值,或如果省略 Expr 引數則使用某天的時間,回傳先前的種子值,
####################################

## 獲取亂數
[root@localhost ~]# awk 'BEGIN{srand();fr=int(10*rand());print fr;}'
7
[root@localhost ~]#

## AWK擴展用法

1. getline 變數名
[root@localhost ~]# awk 'BEGIN{print "Enter your name:";getline name;print name;}'
Enter your name:
hello
hello
[root@localhost ~]#

[root@localhost home]# awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
逐行讀取外部檔案(getline使用方法)
[root@localhost home]# awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost home]#

##合并檔案案例:
1.
[root@localhost home]# more a.txt
100 wang man
200 wangsan woman
300 wangming man
400 wangzheng man
[root@localhost home]# more b.txt
100 90 80
200 80 70
300 60 50
400 70 20
[root@localhost home]# awk '{printf("%s ", $0); getline<"b.txt" ;print $2,$3}' a.txt
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
[root@localhost home]#
#
#### next 用法
#讀取檔案的偶數行
當記錄行號除以2余 1,就跳過當前行,下面的print NR,$0也不會執行, 下一行開始,程式有開始判斷NR%2 值,
這個時候記錄行號是:2 ,就會執行下面陳述句塊:'print NR,$0'
[root@localhost home]# more a.txt
100 wang man
200 wangsan woman
300 wangming man
400 wangzheng man
[root@localhost home]# awk 'NR%2==1 {next} {print NR,$0}' a.txt
2 200 wangsan woman
4 400 wangzheng man
[root@localhost home]#


2. 變數名=system("命令")
[root@localhost home]# awk 'BEGIN{b=system("ls -al");print b;}'
總用量 4
drwxr-xr-x. 3 root root 18 12月 13 09:02 .
dr-xr-xr-x. 20 root root 4096 12月 13 08:03 ..
drwx------. 5 jack jack 128 12月 10 16:36 jack
0
[root@localhost home]#

## 時間函式#
函式名 說明
----------------------------- ------------------------------------------
mktime( YYYY MM DD HH MM SS[ DST]) 生成時間格式
strftime([format [, timestamp]]) 格式化時間輸出,將時間戳轉為時間字串
systime() 得到時間戳,回傳從1970年1月1日開始到當前時間(不計閏年)的整秒數
#########
strftime日期和時間格式說明符

格式 描述
%a 星期幾的縮寫(Sun)
%A 星期幾的完整寫法(Sunday)
%b 月名的縮寫(Oct)
%B 月名的完整寫法(October)
%c 本地日期和時間
%d 十進制日期
%D 日期 08/20/99
%e 日期,如果只有一位會補上一個空格
%H 用十進制表示24小時格式的小時
%I 用十進制表示12小時格式的小時
%j 從1月1日起一年中的第幾天
%m 十進制表示的月份
%M 十進制表示的分鐘
%p 12小時表示法(AM/PM)
%S 十進制表示的秒
%U 十進制表示的一年中的第幾個星期(星期天作為一個星期的開始)
%w 十進制表示的星期幾(星期天是0)
%W 十進制表示的一年中的第幾個星期(星期一作為一個星期的開始)
%x 重新設定本地日期(08/20/99)
%X 重新設定本地時間(12:00:00)
%y 兩位數字表示的年(99)
%Y 當前月份
%Z 時區(PDT)
%% 百分號(%)
##########################

[root@localhost home]# awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
2001年01月01日 星期一 12時12分12秒
[root@localhost home]#
求2個時間段中間時間差,介紹了strftime使用方法
[root@localhost home]# awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}'
2634468
[root@localhost home]#

 


###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
break 當 break 陳述句用于 while 或 for 陳述句時,導致退出程式回圈,
continue 當 continue 陳述句用于 while 或 for 陳述句時,使程式回圈移動到下一個迭代,
next 能能夠導致讀入下一個輸入行,并回傳到腳本的頂部,這可以避免對當前輸入行執行其他的操作程序,
exit 陳述句使主輸入回圈退出并將控制轉移到END,如果END存在的話,如果沒有定義END規則,或在END中應用exit陳述句,則終止腳本的執行
###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


###########################
AWK
----------
模式部分: 決定動作陳述句何時出發及觸發事件,如果省略將時刻保持執行狀態.
動作部分: 在大括號{ }內指明.
模式:
BEGIN.....END.....
begin: 設定計數和列印頭
end:完成文本瀏覽動作后列印輸出檔案總數和結尾狀態標記.
####################################################
{ } 花括號里面的是動作, ( )圓括號里面的是條件
---------------------------------------------------
案例一:
awk 'BEGIN {print "Name\n-------"} {print $1} END {"end-of-report"}' grade.txt

案例二:
awk -F ":" '$4=="50"' /etc/passwd

awk -F ":" '{if($1~/root/) print $0}' /etc/passwd

awk -F ":" '$4=="50" {print $0}' /etc/passwd

[root@localhost ~]# awk '/bash/' /etc/passwd

案例三:
[root@localhost ~]# awk -F ":" '{if($3<$4) print $0 "--------"}' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin--------
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin--------
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin--------
games:x:12:100:games:/usr/games:/sbin/nologin--------
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin--------
[root@localhost ~]#

案例四: 定義變數t=0,匹配到每次加1,末尾列印內容
[root@localhost ~]# awk 'BEGIN{t=0} {if($0~/bash$/) t++} END{ print t}' /etc/passwd
2
[root@localhost ~]#

[root@localhost ~]# awk '$0~/(root|jack)/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
jack:x:1000:1000:jack:/home/jack:/bin/bash
dockerroot:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]#

案例五: && || !
[root@localhost ~]# awk '{if($3 > $2 && $0~/rpc/) print $0}' /etc/passwd
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@localhost ~]#

##內置變數
NF 瀏覽記錄的域個數
NR 已讀取的記錄數

[root@localhost ~]# awk 'END{print NR}' /etc/passwd #輸入檔案的記錄數
49
[root@localhost ~]#
[root@localhost ~]# awk -F ":" 'END{print NF,NR,FILENAME}' /etc/passwd
7 49 /etc/passwd
# NF表示以冒號做分隔讀取了幾個區域;
# NR表示讀取的記錄數;
# FILENAME表示檔案名
#===============================
[root@localhost ~]# awk -F ":" '{if($0~/bash/ && $3=$4 && NR>0) print $0}' /etc/passwd
jack x 1 1000 jack /home/jack /bin/bash
[root@localhost ~]#

[root@localhost network-scripts]# echo $PWD | awk -F / '{print NF}'
4
[root@localhost network-scripts]# echo $PWD | awk -F / '{print $NF}'
network-scripts
[root@localhost network-scripts]# echo $PWD | awk -F / '{print $4}'
network-scripts

#定義變數bline為3,當第三列小于3的時候列印滿足條件全部內容
[root@localhost ~]# awk -F ":" 'BEGIN {bline=3} {if ($3<bline) print $0}' /etc/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
[root@localhost ~]#

##### 當條件有多個圓括號的時候需要添加分號 ############
#域值修改
[root@localhost ~]# awk -F ":" '{if($1=="root") $3=$3+100; print $1,$3}' aa
root 100
bin 1
daemon 2
[root@localhost ~]# more aa
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]#

#對匹配到的字串,進行重新變數賦值
[root@localhost ~]# awk -F ":" '{if($1=="root")($1="admin") ; print $0}' aa
admin x 0 0 root /root /bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]#

## 模式后面 使用花括號將只對修改的部分進行顯示結果
[root@localhost ~]# awk -F ":" '{if($1=="root") {$1="admin" ; print $0} }' aa
admin x 0 0 root /root /bin/bash
[root@localhost ~]#

[root@localhost ~]# awk -F ":" '{if($1=="root") ($1="admin") ($3=$3+100); { print $0} }' aaadmin x 100 0 root /root /bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

## 模式后面 使用花括號將只對修改的部分進行顯示結果
[root@localhost ~]# awk -F ":" '{if($1=="root") {($1="admin")($3=$3+100); print $0} }' aa
admin x 100 0 root /root /bin/bash
[root@localhost ~]#


## 創建新域列 $10
[root@localhost ~]# awk -F ":" '{if($1=="root") {($1="admin")($10=$3+100); print $10} }' aa
100
[root@localhost ~]#

 


## 創建自定義列
[root@localhost ~]# awk -F ":" 'BEGIN {print "Uname \t\t Login"} {if($3<$4) print $1,"\t\t"$7}' /etc/passwd
Uname Login
adm /sbin/nologin
lp /sbin/nologin
mail /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
[root@localhost ~]#


## 將整個檔案的第三域相加
[root@localhost ~]# awk -F ":" '(total+=$3); END{print "第三列相加結果為: "total}' aa
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
第三列相加結果為: 3
[root@localhost ~]#

## 只顯示匹配的內容
[root@localhost ~]# awk -F ":" '{(total+=$3)}; END{print "第三列相加結果為: "total}' aa
第三列相加結果為: 3
[root@localhost ~]#

## 創建變數tot,設定自動相加,在結尾列印匯總結果
[root@localhost ~]# ls -l | awk ' / ^[^X]/ {print $9 "\t" $5} {tot+=$5} END{print "匯總后結果為:" tot}'
匯總后結果為:14523
[root@localhost ~]#

######################
內置函式
######################

## 列印$1長度---->>> length()
[root@localhost ~]# awk -F ":" 'BEGIN {Uname "\t" Login} {if($3>$4) print length($1),$0}' /etc/passwd
4 sync:x:5:0:sync:/sbin:/bin/sync
8 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
4 halt:x:7:0:halt:/sbin:/sbin/halt
8 operator:x:11:0:operator:/root:/sbin/nologin
7 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
14 libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin


## gsub替換; 使用正則運算式替換, (/目標模式/,替換模式)
[root@localhost ~]# awk -F ":" 'gsub(/root/,"admin") {print $0}' /etc/passwd
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
dockeradmin:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]#

[root@localhost ~]# awk -F: '{gsub(/bash/,"admin",$0);print $0}' passwd
root:x:0:0:root:/root:/bin/admin
root:x:0:0:/bin/admin:/root:/bin/admin
root:x:0:0:/bin/admin:/root:/bin/admin
jack:x:1000:1000:jack:/home/jack:/bin/admin
[root@localhost ~]#


## gsub()帶條件替換;當替換為字串需要使用" ";替換內容為整形不需要" "
[root@localhost ~]# awk -F ":" '{if($3<$4) { print $0}}' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin


[root@localhost ~]# awk -F ":" '{if($3<$4) { gsub(/adm/,"jack");print $0}}' /etc/passwd
jack:x:3:4:jack:/var/jack:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]#

#################################################################################
案例: 對比 sub() gsub()區別
#################################
#
#gsub()全域替換
#sub() 替換每行的第一個
#substr() 顯示指定string長度位置
#
#################################
[root@localhost ~]# more passwd 源檔案
root:x:0:0:root:/root:/bin/bash
root:x:0:0:/bin/bash:/root:/bin/bash
root:x:0:0:/bin/bash:/root:/bin/bash
jack:x:1000:1000:jack:/home/jack:/bin/bash
[root@localhost ~]# awk -F: '$0~/bash/ {gsub(/bash/,"admin");print $0}' passwd #替換全文bash為admin
root:x:0:0:root:/root:/bin/admin
root:x:0:0:/bin/admin:/root:/bin/admin
root:x:0:0:/bin/admin:/root:/bin/admin
jack:x:1000:1000:jack:/home/jack:/bin/admin
[root@localhost ~]#
[root@localhost ~]# awk -F: '$0~/bash/ {sub(/bash/,"admin");print $0}' passwd #替換每行第一個bash為admin
root:x:0:0:root:/root:/bin/admin
root:x:0:0:/bin/admin:/root:/bin/bash
root:x:0:0:/bin/admin:/root:/bin/bash
jack:x:1000:1000:jack:/home/jack:/bin/admin
[root@localhost ~]#
###################################################################################
# substr(str,n,m) #顯示字串str從n到m長度大小的內容

[root@localhost ~]# awk '$1~/root/ {print substr($1,1,2)}' /etc/passwd
ro
op
do
[root@localhost ~]# awk '$1~/root/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]#
[root@localhost ~]# awk '$1~/root/ {print substr($1,1,2)}' /etc/passwd #
ro
op
do
[root@localhost ~]#

#
[root@localhost ~]# awk 'BEGIN {str="Iloveyou"}END{print substr(str,2)}' bb ##其中bb可以隨便寫,begin定義內容,end截取內容
loveyou
[root@localhost ~]#


## 查詢字串s中t出現的第一位置,字串需要用雙引號括起來. index( )
[root@localhost ~]# awk 'BEGIN {print index("root","o")}' /etc/passwd
2

## 測驗目標字串是否包含查找字串的一部分,查找到了就回傳所在位置,沒有找到就回傳0
[root@localhost ~]# awk 'BEGIN {print match("ABCD",/D/)}'
4
[root@localhost ~]# awk 'BEGIN {print match("ABCD",/d/)}'
0
[root@localhost ~]#


## split 回傳字串陣列元素個數
#將第一行切割為以冒號作為分隔符的陣列
[root@localhost ~]# head -1 /etc/passwd | awk 'BEGIN{ } {print split($0,array,":")}'
7
[root@localhost ~]#

# sub(/替換前內容/,"替換后字串",$0)
[root@localhost ~]# awk -F: '{if($1=="root") {print $0}}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# awk -F: '{if($1=="root") {sub(/root/,"admin",$0) ;print $0}}' /etc/passwd #sub(/root/,"admin",$0)中的$0可以不寫
admin:x:0:0:root:/root:/bin/bash
[root@localhost ~]#

 

### 定義變數AGE,向awk傳值
[root@localhost ~]# awk -F: '{if($3<AGE) print $0}' AGE=5 /etc/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
[root@localhost ~]#


[root@localhost ~]# who
root pts/0 2018-12-12 09:19 (192.168.80.8)
[root@localhost ~]#
[root@localhost ~]# who | awk '{if($1==user) print $1 " You are connected to " $2}' user=$LOGNAME #傳遞變數
root You are connected to pts/0
[root@localhost ~]#

####################
將awk寫入到腳本檔案
####################
#!/bin/awk -f
BEGIN { }
{ }
END { }
#############################################

#awk; 定義變數t,每次值加1,使用split()切割為陣列, 使用for回圈來遍歷陣列內容
[root@localhost ~]# head -1 /etc/passwd |awk -F ":" 'BEGIN{t=0} {split($0,my,":")}END{for(i in my) {t+=1;print "my["t"]="my[i]}}'
my[1]=0
my[2]=root
my[3]=/root
my[4]=/bin/bash
my[5]=root
my[6]=x
my[7]=0
[root@localhost ~]#


####
sed
####
##
1. [root@localhost ~]# sed -n '10p' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]#


2.[root@localhost ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#

3. 模式與行號混合方式;格式: line_number,/pattern/
案例:
4,/the/ #表示查詢第四行的the

4. 列印模式匹配的行號,使用格式/pattern/=
[root@localhost ~]# sed -n -e '/root/p' -e '/root/=' /etc/passwd
root:x:0:0:root:/root:/bin/bash
1
operator:x:11:0:operator:/root:/sbin/nologin
10
dockerroot:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
48
[root@localhost ~]#

5. a\,可以將指定文本一行或多行附加到指定模式位置;"a\"中的反斜線表示換行
6. i\,可以將指定文本一行或多行插入到指定模式位置;"a\"中的反斜線表示換行
7. c\,將指定模式匹配的行替換;"c\"中的反斜線表示換行
8. d\,將指定模式匹配的行洗掉;"d\"中的反斜線表示換行

[root@localhost ~]# sed -n '/^root/'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# sed -n '/^root/ c\ "admin"' /etc/passwd
"admin"
[root@localhost ~]# sed -n '1 c\ jack' /etc/passwd #將檔案的第一行替換為字串jack
jack
[root@localhost ~]#
[root@localhost ~]# sed -n '1,2'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# sed -n '1,2 c\ admin' /etc/passwd #將第一行到第二行替換為字串admin
adminp
[root@localhost ~]#

#####################3
替換命令: 用替換模式替換指定模式

[address,[address]] s/ pattern-to-find / replacement-pattern/ [g p w n] #注意: n選項將會使p選項無效
發現模式 替換模式

g: 默認只替換第一次出現的模式,使用g表示全域替換
p: 預設將所有被替換行寫入標準輸出,加p選項將使-n選項無效
w: 檔案名,使用此選項將輸出重定向到一個檔案
#--------------------------------------
[root@localhost ~]# sed -n 's/root/ROOT/'p /etc/passwd
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
dockerROOT:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]#
[root@localhost ~]# sed -n 's/root/ROOT/g'p /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
dockerROOT:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]#
[root@localhost shells]# sed -n 's/root/ROOT/w file.txt' /etc/passwd #替換一次,保存檔案
[root@localhost shells]# ls
file.txt
[root@localhost shells]# more file.txt
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
dockerROOT:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost shells]#
[root@localhost shells]# sed -n 's/root/ROOT/g w file.txt' /etc/passwd #全域替換
[root@localhost shells]# more file.txt
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
dockerROOT:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost shells]#

[root@localhost shells]# sed -n 's/root/ROOT/g p w file.txt' /etc/passwd #p螢屏顯示結果;w file.txt保存為檔案;g表示全域匹配
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
dockerROOT:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost shells]# ls
file.txt
[root@localhost shells]# more file.txt
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
dockerROOT:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost shells]#

#####################################
sed -n 's/pattern/replacement-pattern-string &/p'
#在指定的字串前插入內容:
&:保存發現模式以便重新呼叫它,然后把發現模式內容放在替換字串后面

案例一: 在root字串前插入"--ADMINISTRATOR--"
[root@localhost shells]# sed -n 's/root/"--ADMINISTRATOR--" &/p' /etc/passwd
"--ADMINISTRATOR--" root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/"--ADMINISTRATOR--" root:/sbin/nologin
docker"--ADMINISTRATOR--" root:x:988:982:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost shells]#
[root@localhost shells]#
##############################################3

sed -n '[address[,address]] w filename' pathname #將指定的行保存到filename

案例:
[root@localhost shells]# ls
[root@localhost shells]# sed -n '1,2 w file.txt' /etc/passwd
[root@localhost shells]# ls
file.txt
[root@localhost shells]# more file.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost shells]#

##################################################

address r filename #從一個檔案讀取檔案內容到另一個檔案中

案例:
[root@localhost shells]# sed '/root/ r jack.txt' /etc/passwd | more ##將jack.txt檔案讀取存放到/root/模式后
root:x:0:0:root:/root:/bin/bash
####
jack
####
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

##################################################
[root@localhost ~]# more ab
Mr Willis
[root@localhost ~]# sed 's/Mr/ & Jack/g' ab
Mr Jack Willis
[root@localhost ~]# sed 's/Mr/ & Jack/p' ab #將會列印所有檔案內容,
Mr Jack Willis
Mr Jack Willis
[root@localhost ~]# sed -n 's/Mr/ & Jack/p' ab
Mr Jack Willis
[root@localhost ~]#

[root@localhost ~]# echo "file" | sed 's/$/.doc/g' #添加檔案后綴
file.doc
[root@localhost ~]#

@@@@@@@@@@@@@@@@
1. sed 's///g'

2. sed 'address[,address] w filename'

3. sed 'address[,address] r filename'

4. sed -n 's/pattern/replacement-pattern-string &/p'

5. a\,可以將指定文本一行或多行附加到指定模式位置;"a\"中的反斜線表示換行

6. i\,可以將指定文本一行或多行插入到指定模式位置;"a\"中的反斜線表示換行

7. c\,將指定模式匹配的行替換;"c\"中的反斜線表示換行

8. d\,將指定模式匹配的行洗掉;"d\"中的反斜線表示換行

9. sed -n '1,$ l' #l將顯示所有控制字符,很少用
@@@@@@@@@@@@@@@@

 

 

 

 

 

 

 

 

 

 

 

 


####
awk
####

 

一.條件判斷陳述句(if)

if(運算式) #if ( Variable in Array )
陳述句1
else
陳述句2

格式中"陳述句1"可以是多個陳述句,如果你為了方便Unix awk判斷也方便你自已閱讀,你最好將多個陳述句用{}括起來,Unix awk分枝結構允許嵌套,其格式為:

if(運算式)

{陳述句1}

else if(運算式)
{陳述句2}
else
{陳述句3}

[chengmo@localhost nginx]# awk 'BEGIN{
test=100;
if(test>90)
{
print "very good";
}
else if(test>60)
{
print "good";
}
else
{
print "no pass";
}
}'

very good

 

每條命令陳述句后面可以用“;”號結尾,


#------------------------------------------
二.回圈陳述句(while,for,do)

1.while陳述句

格式:

while(運算式)

{陳述句}

例子:

[chengmo@localhost nginx]# awk 'BEGIN{
test=100;
total=0;
while(i<=test)
{
total+=i;
i++;
}
print total;
}'
5050
#------------------------------------------
2.for 回圈

for回圈有兩種格式:

格式1:

for(變數 in 陣列)

{陳述句}

例子:

[chengmo@localhost nginx]# awk 'BEGIN{
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}'

AWKPATH=.:/usr/share/awk
OLDPWD=/home/web97
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
LANG=zh_CN.GB2312

,,,,,,

說明:ENVIRON 是awk常量,是子典型陣列,

格式2:

for(變數;條件;運算式)

{陳述句}

例子:

[chengmo@localhost nginx]# awk 'BEGIN{
total=0;
for(i=0;i<=100;i++)
{
total+=i;
}
print total;
}'

5050
#------------------------------------------
3.do回圈

格式:

do

{陳述句}while(條件)

例子:

[chengmo@localhost nginx]# awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(i<=100)
print total;
}'
5050

以上為awk流程控制陳述句,從語法上面大家可以看到,與c語言是一樣的,有了這些陳述句,其實很多shell程式都可以交給awk,而且性能是非常快的,

break 當 break 陳述句用于 while 或 for 陳述句時,導致退出程式回圈,
continue 當 continue 陳述句用于 while 或 for 陳述句時,使程式回圈移動到下一個迭代,
next 能能夠導致讀入下一個輸入行,并回傳到腳本的頂部,這可以避免對當前輸入行執行其他的操作程序,
exit 陳述句使主輸入回圈退出并將控制轉移到END,如果END存在的話,如果沒有定義END規則,或在END中應用exit陳述句,則終止腳本的執行,

三、性能比較
[chengmo@localhost nginx]# time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;}print total;}')
50005000

real 0m0.003s
user 0m0.003s
sys 0m0.000s
[chengmo@localhost nginx]# time(total=0;for i in $(seq 10000);do total=$(($total+i));done;echo $total;)
50005000

real 0m0.141s
user 0m0.125s
sys 0m0.008s

實作相同功能,可以看到awk實作的性能是shell的50倍!

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/163232.html

標籤:Linux

上一篇:CentOS 7.x 配置靜態 IP 并啟用

下一篇:Linux學習筆記之一

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more