国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux學習筆記(17) Shell編程之基礎(chǔ)

2024-06-28 13:19:32
字體:
供稿:網(wǎng)友
linux學習筆記(17) Shell編程之基礎(chǔ)1. 正則表達式

(1) 正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配。grep、awk、sed等命令可以支持正則表達式;通配符用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配了。

(2) 基礎(chǔ)正則表達式

元字符作用
*前一個字符匹配0次或任意多次
.匹配除了換行符外任意一個字符
^匹配行首,如:^hello會匹配以hello開頭的行
$匹配行尾,如:hello$會匹配以hello結(jié)尾的行
[]

匹配中括號中指定的任意一個字符,只匹配一個字符,如:[aoeiu]匹配任意一

個元音字符,[0-9]匹配任意一位數(shù)字,[a-z][0-9]匹配小寫字母和一位數(shù)字構(gòu)成的兩位字符。

[^]匹配除中括號的字符以外的任意一個字符。
/轉(zhuǎn)義符,用于將特殊符號的含義取消
/{n/}表示其前面的字符恰好出現(xiàn)n次。如:[0-9]/{4/}匹配4位數(shù)字,[1][3-8][0-9]/{9/}匹配手機號碼
/{n,/}表示其前面的字符出現(xiàn)不小于n次,如:[0-9]/{2,/}表示兩位及以上的數(shù)字
/{n,m/}表示其前面的字符至少出現(xiàn)n次,至多出現(xiàn)m次。如:[a-z]/{6,8/}匹配6到8位的小寫字母。

例:創(chuàng)建一個文件file,其內(nèi)容如下:

[root@localhost sh]# vim fileMr. Li said:he was a lucky dog!But since he met Hamster,he never saaaid those Words.6666unbelievable!because,in faaaact,Hamster is the most lucky man!Later,Mr Li soid he would left.
#匹配所有內(nèi)容,包括空白行g(shù)rep "a*" file#匹配至少包含一個a的行g(shù)rep "aa*" file#匹配至少包含兩個連續(xù)a的字符串grep "aaa*" file#匹配至少包含四個連續(xù)a的字符串grep "aaaaa*" file
#"s..d"會匹配在s和d這兩個字母間具有兩個字符的單詞grep "s..d" file#匹配在s和d字母之間的具有任意字符的單詞grep "s.*d" file#匹配所有內(nèi)容grep ".*" file
#匹配大寫M開頭的行g(shù)rep "^M" file#匹配小寫n結(jié)尾的行g(shù)rep "n$" file#匹配空白行g(shù)rep -n "^$" file
#匹配s和i之間要么是a,要么是o的行g(shù)rep "s[ao]id" file#匹配任意一個數(shù)字grep "[0-9]" file#匹配小寫字母開頭的行g(shù)rep "^[a-z]" file
#匹配不用小寫字母開頭的行g(shù)rep "^[^a-z]" file#匹配不以字母開頭的行g(shù)rep "^[^a-zA-Z]" file
#匹配以"."結(jié)尾的行g(shù)rep "/.$" file
#匹配a字母連續(xù)出現(xiàn)三次的字符串grep "a/{3/}" file#匹配包含連續(xù)三個數(shù)字的字符串grep "[0-9]/{3/}" file
#匹配至少用連續(xù)三個數(shù)字開頭的行g(shù)rep "^[0-9]/{3,/}[a-z]" file
#匹配在字母s和i之間至少有1個a,最多有3個a的行g(shù)rep "sa/{1,3/}i"  file
2. 字符截取命令

(1) cut字段提取命令

cut的格式為:cut [選項] 文件名

其中-f選項表示提取第幾列,-d分隔符選項表示指定分隔符分割列。

例:有一個student.txt的文檔,內(nèi)容如下:

ID      Name    gender  Mark1       LiNing  M       862       HanMei  F       903       Jim     M       83

①提取單列:

[root@localhost sh]# cut -f 2 student.txt NameLiNingHanMeiJim

②提取多列:

[root@localhost sh]# cut -f 2,4 student.txt Name    MarkLiNing  86HanMei  90Jim     83

③使用":"作為分隔符提取/etc/passwd中的第一列和第三列

[root@localhost sh]# cut -d ":" -f 1,3 /etc/passwdroot:0bin:1daemon:2adm:3lp:4

④提取/etc/passwd中多個用戶的用戶名的方法:

[root@localhost sh]# cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1wsuser1user2user3

⑤ cut的局限

查詢根分區(qū)(/dev/sda5)的內(nèi)存占用量時,cut命令即無法識別,識別僅限于制表符或由具體分隔符的符號,無法識別空格分隔的符號。

[root@localhost ~]# df -h | grep "sda5" | cut -f 5/dev/sda5        16G  1.8G   13G  13% /

(2) PRintf命令

printf的命令格式為:printf '輸出類型輸出格式' 輸出內(nèi)容

輸出的類型包括:①%ns,表示輸出字符串,n是數(shù)字指代輸出幾個字符;②%ni,輸出整數(shù),n指代輸出幾個數(shù)字;③%m.nf,輸出浮點數(shù),m和n是數(shù)字,指代輸出的整數(shù)位數(shù)和小數(shù)位數(shù)。如%8.2f代表共輸出8位數(shù),其中2位是小數(shù),6位是整數(shù)。

輸出格式包括:

/a輸出警告音
/b輸出退格鍵
/f清空屏幕
/n換行
/r回車
/t水平輸出退格鍵
/v垂直輸出退格鍵

例:

[root@localhost sh]# printf %s 1 2 3 4 5 6123456[root@localhost sh]# printf %s %s %s 1 2 3 4 5 6%s%s123456#輸出的數(shù)字每三個為一組,用單引號或雙引號括起來輸出格式[root@localhost sh]# printf '%s %s %s' 1 2 3 4 5 61 2 34 5 6#加入換行符[root@localhost sh]# printf '%s %s %s/n' 1 2 3 4 5 61 2 34 5 6#使用printf顯示student.txt的內(nèi)容(未調(diào)整格式)[root@localhost sh]# printf "%s" $(cat student.txt)IDNamegenderMark1LiNingM862HanMeiF903JimM83#更改student.txt的內(nèi)容[root@localhost sh]# vim student.txt ID      Name    php     Linux   MySQL   gender  Average1       LiNing  82      95      86      M       87.72       HanMei  72      98      86      F       85.33       Jim     99      83      93      M       91.7#使用printf顯示更改后的stdudent.txt內(nèi)容[root@localhost sh]# printf '%s/t%s/t%s/t%s/t%s/t%s/t%s/n' $(cat student.txt)ID      Name    PHP     Linux   MySQL   gender  Average1       LiNing  82      95      86      M       87.72       HanMei  72      98      86      F       85.33       Jim     99      83      93      M       91.7

在awk命令的輸出中支持print和printf命令,二者的區(qū)別在于print會在每個輸出之后自動加入一個換行符(Linux默認沒有print命令),printf是標準格式輸出命令,并不會自動加入換行符,如果需要換行,需手工加入。

(3) awk命令

awk的功能比cut強大,可以識別空格符作為分隔符。其格式為:

awk '條件1{動作1} 條件2{動作2}...' 文件名

其中,一般將條件表達式作為條件,如x>10,x>=10,x<=10,動作包含格式化輸出及流程控制語句。awk實際上是逐行處理文本內(nèi)容的。

#使用awk讀取student.txt中的第2,7行[root@localhost sh]# awk '{printf $2 "/t" $7 "/n"}' student.txt Name    AverageLiNing  87.7HanMei  85.3Jim     91.7#讀取df -h的第1,5,6行內(nèi)容[root@localhost sh]# df -h | awk '{printf $1 "/t" $5 "/t" $6 "/n"}'Filesystem      Use%    Mounted/dev/sda5       13%     /tmpfs   0%      /dev/shm/dev/sda1       12%     /boot/dev/sda2       4%      /home/dev/sdb1       4%      /root/disk1/dev/sdb5       3%      /root/disk5#結(jié)合使用awk和cut提取根分區(qū)(dev/sda5)的內(nèi)存使用率[root@localhost sh]# df -h | grep /dev/sda5 | awk '{print $5}' | cut -d "%" -f 113

① BEGIN字段表示在所有的命令執(zhí)行之前執(zhí)行BEGIN后的命令,然后再處理隨后的動作。

[root@localhost sh]# awk '{print $2 "/t" $7} BEGIN{print "This is a transcript"}' student.txt This is a transcriptName    AverageLiNing  87.7HanMei  85.3Jim     91.7

② FS內(nèi)置變量用于指定分隔符,手工加入分隔符時,需強制將其設(shè)為BEGIN。

#打印出來的第一行數(shù)據(jù)未處理,因為先讀入文本第一行,再進行處理的時候已略過第一行[root@localhost sh]# awk '{FS=":"}{print $1 "/t" $3}' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin     1daemon  2#因此,需要加上BEGIN字段執(zhí)行[root@localhost sh]# awk '{print $1 "/t" $3} BEGIN{FS=":"}' /etc/passwdroot    0bin     1daemon  2

③ END字段表示其他命令執(zhí)行完之后執(zhí)行END后命令。

[root@localhost sh]# awk 'END{print "END!!"} {print $2 "/t" $7}' student.txt Name    AverageLiNing  87.7HanMei  85.3Jim   

④ 關(guān)系運算符

#提取平均成績大于87的Name字段[root@localhost sh]# cat student.txt | grep -v Name | awk '$7>=87{print $2}'LiNingJim

(4) sed命令

sed是一種幾乎包含所有UNIX平臺(包括Linux)的輕量級編輯器。sed主要是用來將數(shù)據(jù)進行選取、替換、刪除、新增的命令。vi命令只能修改文本內(nèi)容,sed命令既可以修改內(nèi)容,可以修改命令的結(jié)果,shell編程中常用。其格式為:

sed [選項] '[動作]' 文件名

其中:一般sed命令會把所有數(shù)據(jù)都輸出到屏幕,如果加入-n選項,則只會把經(jīng)過sed命令處理的行輸出到屏幕上;-e命令允許對輸入數(shù)據(jù)應(yīng)用多條sed命令編輯;-i選項表示用sed的修改結(jié)果直接修改讀取數(shù)據(jù)的文件,而不是輸出到屏幕。

sed中的動作包括:

a /追加,在當前行后追加一行或多行。添加多行時,出最后一行外,每行末尾需要用"/"代表數(shù)據(jù)未完結(jié)
c /行替換,用c后面的字符串替換原數(shù)據(jù)行,替換多行時,出最后一行外,每行末尾需用"/"代表數(shù)據(jù)未完結(jié)
i /插入,在當前行前插入一行或多行,插入多行時,除最后一行外,每行末尾需用"/"代表數(shù)據(jù)未完結(jié)
d刪除指定行
p打印輸出指定行
s字串替換,用一個字符串替換另外一個字符串。格式為"行范圍s/舊字串/新字串/g"

例:

#輸出student.txt的第二行[root@localhost sh]# sed '2p' student.txt ID      Name    PHP     Linux   MySQL   gender  Average1       LiNing  82      95      86      M       87.71       LiNing  82      95      86      M       87.72       HanMei  72      98      86      F       85.33       Jim     99      83      93      M       91.7#加入-n選項[root@localhost sh]# sed -n '2p' student.txt 1       LiNing  82      95      86      M       87.7#刪除第二行到第四行的數(shù)據(jù),但不修改文件本身[root@localhost sh]# sed '2,4d' student.txt ID      Name    PHP     Linux   MySQL   gender  Average#在第二行后追加hello[root@localhost sh]# sed '2a hello' student.txtID      Name    PHP     Linux   MySQL   gender  Average1       LiNing  82      95      86      M       87.7hello2       HanMei  72      98      86      F       85.33       Jim     99      83      93      M       91.7#在第二行前插入兩行數(shù)據(jù)[root@localhost sh]# sed '2i hello /> world' student.txtID      Name    PHP     Linux   MySQL   gender  Averagehello world1       LiNing  82      95      86      M       87.72       HanMei  72      98      86      F       85.33       Jim     99      83      93      M       91.7#數(shù)據(jù)替換[root@localhost sh]# sed '2c No such person' student.txt ID      Name    PHP     Linux   MySQL   gender  AverageNo such person2       HanMei  72      98      86      F       85.33       Jim     99      83      93      M       91.7#字串替換#將第三行的72換成100[root@localhost sh]# sed '3s/72/100/g'  student.txt ID      Name    PHP     Linux   MySQL   gender  Average1       LiNing  82      95      86      M       87.72       HanMei  100     98      86      F       85.33       Jim     99      83      93      M       91.7#同時把LiNing和Jim替換為空[root@localhost sh]# sed -e 's/LiNing//;s/Jim//g' student.txt ID      Name    PHP     Linux   MySQL   gender  Average1               82      95      86      M       87.72       HanMei  100     98      86      F       85.33               99      83      93      M       91.7#加入-i選項Jim改為Tom直接寫入文件[root@localhost sh]# sed -i '4s/Jim/Tom/g' student.txt [root@localhost sh]# cat student.txt ID      Name    PHP     Linux   MySQL   gender  Average1       LiNing  82      95      86      M       87.72       HanMei  100     98      86      F       85.33       Tom     99      83      93      M       91.7
3. 字符處理命令

(1) sort排序命令

格式為:sort [選項] 文件名

其中-f選項表示忽略大小寫;-n選項以數(shù)值型進行排序,默認使用字符串型排序;-r選項表示反向排序;-t選項表示指定分隔符,默認的分隔符為制表符;-k n[,m]選項表示按照指定的字段范圍排序,從第n字段開始,m字段結(jié)束(默認到行尾)。

#排序用戶信息文件[root@localhost sh]# sort /etc/passwdabrt:x:173:173::/etc/abrt:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologin......#反向排序[root@localhost sh]# sort -r /etc/passwdws:x:500:500::/home/ws:/bin/bashvcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin......#指定分隔符為":",且只使用第三字段排序(默認為zi)[root@localhost sh]# sort -t ":" -k 3,3 /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinOperator:x:11:0:operator:/root:/sbin/nologin......#對第三序列進行數(shù)值排序[root@localhost sh]# sort -n -t ":" -k 3,3 /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

(2) 統(tǒng)計命令wc

格式為:wc [選項] 文件名

其中,-l選項表示只統(tǒng)計行數(shù);-w選項表示只統(tǒng)計單詞數(shù);-m選項表示只統(tǒng)計字符數(shù)。

4. 條件判斷式

(1) 按照文件類型進行判斷

測試選項作用
-b 文件判斷該文件是否存在,且是否為塊設(shè)備文件
-c 文件判斷該文件是否存在,且是否為字符設(shè)備文件
-d 文件判斷該文件是否存在,并且是否為目錄文件
-e 文件判斷該文件是否存在
-f 文件判斷該文件是否存在,且是否為普通文件
-L 文件判斷該文件是否存在,且是否為符號鏈接文件
-p 文件判斷該文件是否存在,且是否為管道符文件
-s 文件判斷該文件是否存在,并且是否為空
-S 文件判斷該文件是否存在,且是否為套接字文件

兩種判斷格式:

#①查看root下的install.log是否存在[root@localhost ~]# test -e /root/install.log#0表示存在[root@localhost ~]# echo $?0#②腳本當中常用的判斷格式為中括號,同樣執(zhí)行上面的查詢,注意中括號兩端有空格[root@localhost ~]# [ -e /root/install.log ] && echo $?0#第一條命令執(zhí)行正確,打印yes,否則打印no[root@localhost ~]# [ -d /tmp/ ] && echo "yes" || echo "no"yes

(2) 按照文件的權(quán)限進行判斷

測試選項作用
-r 文件判斷該文件是否存在,且是否擁有讀權(quán)限
-w 文件判斷該文件是否存在,且是否擁有寫權(quán)限
-x 文件判斷該文件是否存在,且是否擁有執(zhí)行權(quán)限
-u 文件判斷該文件是否存在,且是否擁有SUID權(quán)限
-s 文件判斷該文件是否存在,且是否擁有SGID權(quán)限
-k 文件判斷該文件是否存在,且是否擁有SBit權(quán)限
#只要u、g、o中有一個擁有寫權(quán)限,即返回yes[root@localhost tmp]# [ -w sh/student.txt ] && echo yes || echo noyes

(3) 兩個文件之間進行比較

測試選項作用
文件1 -nt 文件2判斷文件1的修改時間是否比文件2的新
文件1 -ot 文件2判斷文件1的修改時間是否比文件2的舊
文件1 -ef 文件2判斷文件1和文件2的Inode號是否一致,可理解為兩文件是否為同一個文件(判斷硬鏈接的好方法)
[root@localhost sh]# pwd/tmp/sh#創(chuàng)建硬鏈接[root@localhost sh]# ln student.txt ../student1.txt#判斷兩文件是否為同一文件[root@localhost sh]# [ student.txt -ef ../student1.txt ] && echo yes || echo noyes

(4)兩個整數(shù)之間的比較

測試選項作用
整數(shù)1 -eq 整數(shù)2判斷整數(shù)1是否和整數(shù)2相等
整數(shù)1 -ne 整數(shù)2判斷整數(shù)1是否和整數(shù)2不相等
整數(shù)1 -gt 整數(shù)2判斷整數(shù)1是否大于整數(shù)2
整數(shù)1 -lt 整數(shù)2判斷整數(shù)1是否小于整數(shù)2
整數(shù)1 -ge 整數(shù)2判斷整數(shù)1是否大于等于整數(shù)2
整數(shù)1 -le 整數(shù)2判斷整數(shù)1是否小于等于整數(shù)2
[root@localhost sh]# [ 23 -gt 22 ] && echo yes || echo noyes[root@localhost sh]# [ 23 -le 22 ] && echo yes || echo nono

(5) 字符串的判斷

測試選項作用
-z 字符串判斷字符串是否為空
-n 字符串判斷字符串是否為非空
字串1==字串2判斷字符串1是否和字符串2相等
字串1!=字串2判斷字符串1是否和字符串2不相等
[root@localhost sh]# name=ws[root@localhost sh]# [ -z "$name" ] && echo yes || echo nono[root@localhost sh]# name1=ws[root@localhost sh]# [ "$name"=="$name1" ] && echo yes || echo noyes

(6) 多重條件判斷

測試選項作用
判斷1 -a 判斷2邏輯與,判斷1和判斷2都成立,最終的結(jié)果才為真
判斷1 -o 判斷2邏輯或,判斷1和判斷2有一個成立,最終的結(jié)果即為真
! 判斷邏輯非,使原始的判斷式取反
#判斷變量aa是否有值,并且其值是否大于23[root@localhost sh]# [ -n "$aa" -a "$aa" -gt 23 ] && echo yes || echo nono


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 天柱县| 宁夏| 永康市| 兴城市| 来宾市| 墨玉县| 万载县| 临漳县| 迭部县| 德阳市| 高唐县| 沁阳市| 张家口市| 阿荣旗| 柯坪县| 友谊县| 渑池县| 萨迦县| 芜湖市| 平阳县| 韶山市| 堆龙德庆县| 江都市| 铜山县| 临猗县| 宁蒗| 阿图什市| 南木林县| 佛冈县| 麦盖提县| 江安县| 金华市| 衡南县| 英吉沙县| 邹平县| 广丰县| 江达县| 阜平县| 昭苏县| 龙岩市| 南开区|