shell 運行環(huán)境
bash下還可以再重新啟動?個shell,這個shell是sub shell新蟆,原shell會復 制??給他怕品。在sub shell中定義的變量族壳,會隨著sub shell的消亡?消失
() 子shell中運行
$(ls) 表示執(zhí)行l(wèi)s后的結(jié)果旭绒,與``作用一致纺且,不過可以嵌套
{}當前shell中執(zhí)行
$$當前腳本執(zhí)行的pid
&后臺執(zhí)行
$剩晴!運行在后臺最后一個作業(yè)的pid(進程ID)
shell Piping 管道
? Read ?來讀取輸?曼振,并賦值給變量
? echo 较木,printf可以簡單輸出變量红符。
? > ?le 將輸出重定向到另?個?件
? >> 表?追加 等價于tee -a
? < ?le 輸?重定向
| 表?管道,也就是前?個命令的輸出傳?下?個命令 的輸入
Linux 三劍客
grep(數(shù)據(jù)查找定位)
awk(數(shù)據(jù)切片)
sed(數(shù)據(jù)修改)
類?SQL
grep=select * from table
awk=select ?eld from table
sed=update table set ?eld=new where ?eld=old
grep
- 常用 -i -v -o -E -oE
grep pattern file
grep -i pattern file 忽略大小寫
grep -o pattern file 精準匹配
grep -v pattern file 反轉(zhuǎn)查找劫映,輸出與查找條件不匹配的行
grep -E pattern file 擴展正則表達式
grep -A -B -C pattern file 顯示命中數(shù)據(jù)的上下文
grep pattern file -r dir / 遞歸搜索
一般使用 -oE 來模糊搜索
- 實例
echo 'hello test!' | grep -o 'e'
不加-o會把包含匹配信息所在行中的所有內(nèi)容輸出(不在一行的不會輸出)
正則表達式
- 基本表達式
^開頭
$結(jié)尾
[a-z][0-9]區(qū)間
.匹配任意一個字符
*0個或多個 能匹配多少匹配多少
.* 加在一起就是:匹配任意多個字符
echo 1234 | grep -E "^.*?" 輸出 1234
- 基本正則與擴展正則的區(qū)別
? 非貪婪模式 ,盡量少的匹配
+ ?個或者多個
() 分組
{} 范圍約束
| 匹配多個表達式的任何?個
echo 1234 | grep -oE ".*?" 輸出 為空
echo 1234 | grep -oE '..*?' 輸出 1
2
3
4
解讀: .*?什么也沒有 再加個. 全部匹配
echo "hello,nihao ,hi" | grep -E "(hello)|(hi)" //該括號不加也行
- curl命令:
curl 網(wǎng)址 | grep 正則
curl -s https://www.baidu.com/ | grep 正則
-s :加上表示會屏蔽curl的一些調(diào)試信息违孝,一般都加
'^ <a title=".*"'
^:精準匹配,表示這行開始時有空格泳赋,然后是<a title=
- 實例
通過百度搜索關(guān)鍵字雌桑,然后通過正則匹配出搜索結(jié)果約xxx的內(nèi)容,關(guān)鍵字以文件的形式作為參數(shù)循環(huán)傳入
創(chuàng)建文件 vim keywords
輸入要搜索的關(guān)鍵字:java祖今、python校坑、C++
shell執(zhí)行語句 while read m; do echo
m; done < keywords | grep -o "結(jié)果約[0-9,]*"
awk命令
awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
awk 'BEGIN{}END{}' 開始和結(jié)束
- 常用命令
awk 'pattern{action}' ??
awk 'BEGIN{}END{}' ??開始和結(jié)束
awk '/Running/' ??????正則匹配
awk '/aa/,/bb/' ????????區(qū)間選擇
awk '$2~/xxx/' ??????字段匹配
awk 'NR=2' ???????? 取第二行
awk 'NR>1' ???????? 去掉第一行
- awk 內(nèi)置變量
FS ??????字段分隔符
OFS????輸出數(shù)據(jù)的字段分隔符
RS ??????記錄分隔符
OR ???? 輸出字段的行分隔符
NF ??????字段數(shù)
NR ??????記錄數(shù)
- awk的字段數(shù)據(jù)處理
-F 參數(shù)指定字段分隔符
BEGIN{FS='_'} 也可以表示分隔符
$0 代表當前記錄
$1 代表第一個字段
$N 代表第N個字段
$NF 代表最后一個字段
- awk的字段分割
echo '1,2,3
>4,5,6
>7,8,9' | awk -F, '{print $2}'
其中-F 后的緊跟是分隔符,如圖的分隔符是“千诬,”
echo 0}' | awk -F/ '{print
2,
4}'
awk 'BEGIN{print 1*10*2}' ??????? 輸出 20
- 把單行拆分為多行
? echo 0}'
? echo 0}'
? echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
- 多行組合為單行
? echo 0}' | awk 'BEGIN{FS="\n";ORS=":"}{print $0}'
'BEGIN{
初始化語句
}
{
pattern{actions}耍目;
pattern{actions};
...
}
END{
讀取所有輸入行后執(zhí)行語句
}'
? 如果BEGIN區(qū)塊存在徐绑,awk首先執(zhí)行它里面包含的動作指令邪驮。
? 當awk讀完所有的輸入行后,如果存在END區(qū)域傲茄,執(zhí)行END區(qū)域的指令
- pattern`(條件)可以是以下兩種類型:
正則表達式:/正則表達式/
布爾表達式:表達式成立毅访,觸發(fā)相應(yīng)的actions執(zhí)行,如 5>3{print}
- actions(動作)是由許多awk指令構(gòu)成
awk的I/O指令有print盘榨、printf()喻粹、getline等
awk的流程控制指令有if...else...、 while() {...}等
所有 awk 的動作草巡,亦即在 {} 內(nèi)的動作守呜,如果有需要多個指令輔助時,可利用分號“;”間隔, 或者直接以[Enter] 按鍵來隔開每個指令
與 bash shell 的變量不同查乒,在 awk 當中弥喉,變量可以直接使用,不需加上 $ 符號玛迄。
- awk 主要是處理“每一行的字段內(nèi)的數(shù)據(jù)”档桃,而默認的“字段的分隔符號為 "空白鍵" 或 "[tab]鍵" ”! 也就是說憔晒,比如有這樣一行內(nèi)容“hello shell”藻肄, awk就會當成是兩列$1取第一列的數(shù)據(jù),$2取第二列的數(shù)據(jù)
例子:
curl https://testing-studio.com/ | grep -o "http[s]://.* " ---不用解釋吧(過濾http或https://開頭的)
----[s]表示區(qū)間
"http[s]://[^ '\“]* " 加上了[^ ‘\”] 表示不選擇以空格加單引號結(jié)尾的或者雙引號結(jié)尾對
注意:去掉了星號前面的點
sed
sed 本身也是一個管道命令拒担,可以分析 standard input 嘹屯,而且 sed 還可以將數(shù)據(jù)進行取代、刪除从撼、新增州弟、擷取特定行等等的功能
-n :使用安靜(silent)模式。在一般 sed 的用法中低零,所有來自 STDIN 的數(shù)據(jù)一般都會被列出到屏幕上婆翔。但如果加上 -n 參數(shù)后,則只有經(jīng)過 sed 特殊處理的那一行(或者動作)才會被列出來掏婶。
-e :直接在命令行界面上進行 sed 的動作編輯啃奴;
-f :直接將 sed 的動作寫在一個文件內(nèi), -f filename 則可以執(zhí)行 filename 內(nèi)的 sed 動作雄妥;
-r :sed 的動作支持的是延伸型正則表達式的語法最蕾。(默認是基礎(chǔ)正則表達式語法)
-i :直接修改讀取的文件內(nèi)容,而不是由屏幕輸出老厌。
動作說明: [n1[,n2]]function
n1, n2 :不見得會存在瘟则,一般代表“選擇進行動作的行數(shù)”,舉例來說枝秤,如果我的動作
是需要在 10 到 20 行之間進行的醋拧,則“ 10,20[動作行為] ”
function 有下面這些:
a :新增, a 的后面可以接字串淀弹,而這些字串會在新的一行出現(xiàn)(目前的下一行)~
c :取代丹壕, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行垦页!
d :刪除雀费,因為是刪除啊干奢,所以 d 后面通常不接任何咚咚痊焊;
i:插入, i 的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的上一行)薄啥;
p :打印辕羽,亦即將某個選擇的數(shù)據(jù)印出。通常 p 會與參數(shù) sed -n 一起運行~
s :取代垄惧,可以取代匹配到的值刁愿!通常這個 s 的動作可以搭配正則表達式!
例如 1,20s/old/new/g就是啦到逊!
less命令
curl -s http://www.baidu.com | less 進入交互式界面铣口,可以上下左右移動
sed 's#ti原始內(nèi)容#替換后內(nèi)容#g' ????????g結(jié)尾表示全局替換
| sort | uniq ???????? 去重
sed后面接的動作,務(wù)必以 ‘單引號’ 括起來哦
如果有多個動作觉壶,使用-e分隔 如脑题,nl /etc/passwd | sed -n -e '1,10p' -e '2,5d' -e '6i hello'
補充正則
字符匹配:
.任意單個字符
[]指定范圍的字符
[^]不在指定范圍的字符
次數(shù)匹配:
- 匹配前面字符0次或者任意次
? 0或1次
- 1次或多次
{m} 匹配m次
{m,n} 至少m,至多n次
位置:
^ 行首
$ 行尾
^$ 空行
分組:
() 表示一個整體
egrep ‘r(oo)|(at)o‘ 1.txt 匹配roo或者ato
或者:
|
a|b a或b
C|cat C或cat
(C|c)at Cat或cat