##簡介
shell編程中的讀取,函數,正則表達式,文本處理工具的簡單使用
read
read:讀取控制臺的輸入
參數:
- -p:指定讀取時的提示符
- -t:等待讀取的時間
腳本例子
編寫i.sh腳本,enter your name:提示用戶在控制臺輸入,如果5秒未輸入自動執行退出
#!/bin/bash
read -t 5 -p "enter your name:" name
echo "hello,$name"
. i.sh
運行腳本
函數
分為系統函數和自定義函數
系統函數
系統自帶的一些,但是感覺使用起來和命令差不多
basename
basename:截取文件名
可帶參數 suffix:后綴,會去掉文件名的后綴
basename /tmp/a.txt .txt
dirname
dirname:獲得文件的路徑,不包括文件名
dirname /tmp/a.txt
自定義函數
語法
方法名()
{
方法體
}
在腳本中編寫方法:
#! /bin/bash
function add(){
s=$[ $1 + $2 ]
echo $s
}
read -p "enter first numnber: " a
read -p "enter second number: " b
add $a $b
這個腳本就是提示用戶輸入a,b兩個參數
add $a $b調用方法,傳入a,b變量
運行結果:
正則表達式
對自己想要的字符或者文本做模糊式的匹配搜索,就使用正則表達式寫一個匹配的規則。
linux中很多的文本工具都是支持正則表達式的,比如grep。
常用的匹配字符
^
^可以匹配以指定字符開頭的行
cat a.txt | grep ^j
可以查詢a.txt文本中的以j開頭的行
$
$可以匹配以指定字符結尾的行
cat a.txt | grep oo$
可以查詢a.txt文本中的以oo結尾的行
.
.:可以匹配一個任意字符
cat a.txt | grep h...o
可以查詢包含h開頭,o結尾的5個字符的字符串的行,h和o之間的3個字符任意
*
*:不是單獨使用的,是前一個字符出現0次或者多次,即h *e表示可以匹配到e,he,hhe
cat a.txt | grep hel*o
可以和.結合使用,.*表示任意字符任意長度
[ ]
[]:字符區間,表示匹配某個范圍內的字符
常用的方式有
- [0,9]:匹配0或者9
- [0-9]:匹配0-9中的一個字符
- [0-90]*:匹配任意長度的0-9中的字符,即任意數字
- [a-z]:匹配任意字母字符
\
\:轉義符,對于一些特殊的符號,要使用轉義符
cat a.txt | grep '\$'
需要使用’'單引號
擴展
一些擴展是不支持的,需要-E參數
刷選手機號:
匹配規則是1開頭,0-9數字出現10次的字符
{}里面可以添加數字,但需要加-E參數來支持
需要有$來限制
文本處理工具
cut
可以從文件中的每一行去進行分割,選擇輸出想要的內容
參數:
- -f:選擇第幾列
- -d:分割符
- -c:按字符進行分割
例子
有一個a.txt文本
使用cut
cat a.txt | cut -d " " -f 2
輸出:
解析:
-d " " 表示以空格分割,a.txt中則會被分割成兩列
-f 2 表示選擇第二列
如果想選擇多個列,可以,隔開, -f 2,3,4
如果想選擇2列到4列的內容,可以使用 -f 2-4
如果想選擇2列之后的全部,可以使用 -f 2-
awk
和cut類似,只是功能更加的強大,默認以空格分開,可以對選擇的部分做處理。
參數:
- -F:分隔符
- -v:可以引入一個變量
例子
有一個a.txt文本
使用awk
cat a.txt | awk '/^hello/ {print $2","$1}'
輸出結果:
解析:
‘/^hello/ {print $2","$1}’:它是分成兩部分的,第一部分是/^hello/,是一個正則表達式,可以帥選想要的內容,可以省略的。第二部分是{print $2",“$1},print是輸出,”,"是輸出選擇的兩列內容中間以什么分割。這兩部分要寫在’ '單引號中,因為awk是默認空格分割的,所以沒有指定分割符了,不然可以使用-F指定分割符。
添加字符串
可以在開頭和結尾添加字符串,使用BEGIN{print “內容”}和END{print “內容”}
cat a.txt | awk 'BEGIN{print "begin"} /^hello/ {print $2","$1} END{print "end"}'
運行結果:
可以對列加減
準備一個a.txt,第三列是數字
cat a.txt | awk '{print $3 + 1}'
運行結果:
使用自定義變量
cat a.txt | awk -v i=1 '{print $3 + i}'
使用-v參數可以引入自定義變量,傳遞給’'部分
內置變量
awk中默認自帶的變量
- FILENAME:文件名
- NR:已讀行號
- NF:列數
查詢文件中的空行行號:
準備一個a.txt文件
awk '/^$/ {print NR}' a.txt
運行結果: