Shell编程1
1.1 基礎正則表達式
1.1.1 正則表達式與通配符
正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配。
grep ?awk ?sed 等命令可以支持正則表達式
grep ?(global search regular expression and print out the line) ?提取行
包含匹配字符串
?
通配符用來匹配符合條件的文件名,通配符是完全匹配。
ls ?find ?cp 這些命令不支持正則表達式,所以只能使用Shell自己的通配符來進行匹配了
完全匹配文件名
?
anaconda-ks.cfg 安裝信息
1.1.2 基礎正則表達式
元字符 ?作用
* ???前一個字符匹配0次或任意多次
. ? 匹配除了換行符外任意一個字符
^ ? 匹配行首。例如:^hello會匹配以hello開頭的行
$ ??匹配行尾。例如:hello$會匹配以hello結尾的行
[] 匹配中括號中指定的任意一個字符
[^] 匹配除中括號中字符以外的任意字符
\ ???轉義字符 ?用于取消特殊符號的含義
\{n\} 表示其前面的字符恰好出現n次。
[0-9]\{4\} 匹配4位數字
[1][3-8][0-9]\{9\} 匹配手機號碼
\{n,\} ?表示其前面的字符出現不小于n次。
\{n,m\} 不小于n次,不大于m次
1.1.3 字符截取命令
cut字段提取命令
cut 選項 文件名
????-f 列號: ?提取第幾列
????-d 分隔符:按照指定分隔符分割列 ?默認分隔符是制表符:Tab
vi student.txt
ID ?Name ?Gender ?Mark
1 ? Zhang ? ?M ???86
2 ? Li ? ?M ???90
3 ? Wang ? ?M ???83
#中間不是空格,是Tab鍵
?
cut -f 2 student.txt
cut -f 2,4 student.txt
cut -d ":" -f 1,3 /etc/passwd
cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1
?
cut 命令的局限——對于空格分隔無能為力,需要用awk命令
df -h | cut -d " " -f 1,3
1.1.4 printf命令
printf '輸出類型輸出格式' 輸出內容
?
輸出類型:
??%ns ???輸出字符串。n是數字,指代輸出幾個字符
??%ni ???輸出整數。n是數字,指代輸出幾個數字
??%m.nf ?輸出浮點數。m和n是數字,指代輸出的總位數和小數位數
?
輸出格式:
??\a ???輸出警告音
??\b ???輸出退格鍵Backspace
??\f ???清除屏幕
??\n ???換行
??\r ???回車鍵Enter
??\t ???水平輸出退格鍵,也就是Tab鍵
??\v ???垂直輸出退格鍵,也就是Tab鍵
?
printf '%s %s %s\n' 1 2 3 4 5 6 ?#三個為一組,換行輸出
printf '%s' $(cat student.txt) ?#作為一個連續的整體輸出:IDNAMEGENDER....
printf '%s\t %s\t %s\t %s\t\n' $(cat student.txt) ?#同樣格式輸出
?
在awk命令的輸出中支持print和printf命令
?
print:會在每個輸出之后自動加入一個換行符(Linux默認沒有print命令)
printf:是標準格式輸出命令,并不會自動加入換行符,如果需要換行,需要手工加入換行符
?
1.1.5 awk命令??
pattern scanning and processing language
截取列
分隔符默認是Tab 和 空格
?
awk ‘條件1{動作1}條件2{動作2}...’ 文件名
?
條件(Pattern)
一般使用關系表達式作為條件
x> 11 判斷變量x是否大于11
x>=11 大于等于
x<=11 小于等于
?
動作(Action)
格式化輸出
流程控制語句
?
vi student.txt
ID Name PHP Linux MySQL Average
1 Zhang 82 95 ?????86 ????87.66
2 Li ? ? 74 96 ?????87 ????85.66
3 Wang ? ? 99 83 ?????93 ????91.66
awk '{printf $2 "\t" $6 "\n"}' student.txt
{}之間的是正則
$0代表整行
$1代表第一列
$2代表第二列
?
df -h | awk '{print $1 "\t" $5 "\t" $6}'
df -h | grep sda5 | awk '{print $5}' | cut -d "%" -f 1
?
?
BEGIN
awk 'BEGIN{print "test !!"} {print $2 "\t" $5}' student.txt
BEGIN 后的動作只執行一次
?
FS內置變量
用FS指定分隔符??
awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $1 "\t" $3 "\n"}'
?
END
awk 'END{print "The End"}{printf $2 "\t" $6 "\n"}' student.txt
?
?
關系運算符
cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n"}'
?
awk 是可以編程的
?
1.1.6 sed 命令
grep 行截取
cut awk 列截取
?
sed是一種幾乎包括在所有UNIX平臺(包括Linux)的輕量級流編輯器。
stream editor for filtering and transforming text
sed主要是用來將數據進行選取、替換、刪除、新增的命令
用于操作命令的結果,實際應用于Shell腳本
?
sed 選項 '[動作]' 文件名
選項:
-n ???一般sed命令會把所有數據都輸出到屏幕,如果加入此選擇,則只會把經過sed命令處理的行輸出到屏幕
-e ???允許對輸入數據應用多條sed命令編輯
-i ???用sed的修改結果直接修改讀取數據的文件,而不是由屏幕輸出
?
動作:
a \ 追加,在當前行后添加一行或多行。
添加多行時,除最后一行外,每行末尾需要用“\”代表數據未完結
?
c \ 行替換,用c后面的字符串替代原數據行,替換多行時,除最后一行外,
每行末尾需用“\”代表數據未完結
?
i \ 插入,在當前行前插入一行或多行。
插入多行時,除最后一行外,每行末尾需要用“\”代表數據未完結
?
d 刪除,刪除指定的行
p 打印,輸出指定的行
s 字串替換,用一個字符串替換另外一個字符串。格式為“行范圍s/舊字串/新字串/g”
和vim中的替換格式類似
?
sed '2p' student.txt
#查看文件的第二行,文件全部顯示,第二行出現兩次
?
sed -n '2p' student.txt
#只出現第二行
?
df -h | sed -n '2p'
?
sed '2,4d' student.txt
#刪除第二行到第四行的數據,但不修改文件本身
?
sed '2a hello' student.txt
#在第二行后追加hello
?
sed ‘2i hello \ ??world’student.txt
#在第二行前插入兩行數據
?
sed '2c No such person' student
#數據替換
?
字符串替換
sed 's/舊字串/新字串/g' 文件名
?
sed '3s/74/99/g' student.txt
#在第三行中,把74換成99
?
sed -i '3s/74/99/g' student.txt
#sed操作的數據直接寫入文件
?
sed -e 's/Zhang//g;s/Wang//g' student.txt
#同時把“Zhang”和“Wang”替換為空
盡量不用i,如需修改文件,用vim編輯器
1.1.7 字符處理命令??
排序命令 sort
sort 選項 文件名 ?可以接受管道符
-f 忽略大小寫
-n 數值型排序,默認以字符串型排序
-r 反向排序
-t 指定分隔符,默認為制表符
-k n,m 指定從n字段到m字段進行排序
?
sort /etc/passwd
sort -r /etc/passwd
sort -t ":" -k 3,3 /etc/passwd 用UID排序
sort -n -t ":" -k 3,3 /etc/passwd
統計命令wc
wc 選項 文件名 ?可以接受管道符
-l 行數
-w 單詞數
-m 字符數
總結