馬哥linux學習——基礎篇05
egrep及擴充套件的正則表示式=grep -E
grep [OPTIONS] PATTERN [FILE...]
擴充套件正則表示式元字元
字元匹配:
.匹配任意單個字元
[]指定範圍內的任意單個字元
[^]指定範圍外的任意單個字元
次數匹配:
*其前的字元任意次
?:0或1次
+:1次或多次
{M}:匹配m次
{m,n}至少M,之多n次
不需要/
錨定符:
^行首錨定
$行尾錨定
\<,\b詞首錨定
\>,\b詞尾錨定
分組
() 無須轉義
後行引用\1,\2….
或者:
a|b:a或b
C|cat:C或cat
(C|c)at:Cat或cat
目錄名(dirname)+基名(basename)=完整路徑
fgrep不基於正則表示式進行快速搜尋,只找給的相應字元
Bash的基礎特性(4)
變數型別:
資料儲存格式、儲存空間的大小、參與運算種類
字元型
數值型
整型
浮點型
強型別程式語言:定義變數時必須指定型別、參與運算必須符合型別要求,呼叫未宣告變數會報錯
弱型別程式語言:無須指定型別,預設均是字元型,參與運算會自動進行隱式型別轉換,變數無須實現定義可直接呼叫
bash中的種類:
根據變數的生效範圍等標準
本地變數:生效範圍為當前shell程序的生存週期,對其他和當前shell的子程序也無效
(pstree檢視程序,bash再開啟一個shell就無效了,exit退回上層)
環境變數:生效範圍當前shell和其子shell,其他shell無效
declare -x name=obama 使用環境變數
區域性變數:生效範圍為當前shell程序的某段程式碼片段(通常指函式)
位置變數:$1,$2,$3。。。。用於指令碼在指令碼程式碼中呼叫通過命令列傳遞給其他引數
特殊變數:
$?,最近的命令執行狀態
$0,命令本身
$*,
$#
本地變數:
變數賦值:name=‘value’
可以使用引用:
value
1、Value可以直接是字串;name=“username”
2、可以使變數引用;name=“$nameuser”
3、命令引用:name=`COMMAND`(反引號,tab上方,將命令執行後賦值)
變數引用:${name},$name(大括號大多數情況下可以省略)
例子:
animals=dog
echo “there are some ${animal}s” 才可以帶上s
“”弱引用,其中的變數引用會被替換為變數值
‘’強引用,其中的變數引用不會被替換為變數的值,而保持原字元
顯示已定義的所有變數:(本地環境、環境變數等)
Set:
銷燬變數:
Unset name
環境變數:
變數宣告、賦值
export name=VALUE 把一個變數匯出為環境變數
declare –x name=VALUE
變數的引用方式:$name,${name}
顯示所有環境變數
export
env
printenv
銷燬變數:
unset NAME
Bash有許多內建的環境變數:PATH,SHELL UID HISTSIZE HOME PWD OLD HISTFILE PS1
變數命名法則:(儘量不要使用全大寫,或者下劃線開頭,可能與環境變數衝突)
1、 不能使用程式中的保留字:例如:if,for
2、 只能使用數字、字母以及下劃線,且不能數字開頭
3、 見名之意
只讀變數:(常量)修改後不可以再修改
Readonly NAME(變數名字)
Declare –r NAME
位置變數:
在指令碼程式碼中呼叫通過命令列傳遞給指令碼的引數
$1,$2…..對應呼叫第1、第2等引數
$0命令本身
$*傳遞給指令碼的所有引數
[email protected]傳遞給指令碼的所有引數
$#:傳遞給指令碼的引數的個數
Shift [n] 換崗操作,一個變數標識多個引數
vim *.sh
#!/bin/bash
echo $2
echo "\$*: $*"
echo "\[email protected]: [email protected]"
echo "\$#: $#"
./*sh 引數1 引數2 引數3
vim *.sh
#!/bin/bash
echo $1
shift
echo $1
shift
echo $1
echo "\$*: $*"
echo "\[email protected]: [email protected]"
echo "\$#: $#"
./*sh 引數1 引數2 引數
判斷給出檔案的行數
vim *.sh
#!/bin/bash
linecount="$(wc -l $1| cut -d' ' -f1)"
echo "$1 has $linecount lines"
Bash的配置檔案
按照生效範圍,存放兩類:
1、全域性配置:
/etc/profile
/etc/profile.d/*.sh(當配置檔案過大,分成多個片段存放在該目錄下)
/etc/bashrc
2、個人配置:
~/.bash_profile
~/.bashrc
按功能劃分,存在兩類:
1、 profile類:為互動式登陸的shell提供的配置
全域性的:(有可能普通使用者沒用許可權讀取執行)
/etc/profile,
/etc/profile.d/*.sh(該目錄下的檔案普通使用者可能沒有執行許可權)
個人:(只對單獨的使用者執行)
~/.bash_profile
功用:
•用於定義環境變數
•執行命令或指令碼
•
2、 bashrc:為非互動式登陸的shell提供的配置
全域性:
/etc/bashrc
個人:
~/.bashrc
功用:
•定義命令別名
•定義本地變數
•
shell登陸:
1、 互動式登陸:
1.直接通過終端輸入賬號密碼登陸
2.Su – username或 su –l username登陸切換的使用者
首先讀取/etc/profile——》/etc/profile.d/*.sh——》~/.bash_profile——》~/.bashrc——》/etc/bashrc
越是最後複製的生效
2、 非互動式登陸:
su username
圖形化介面開啟的終端
執行的指令碼
讀取:~/.bashrc——》/etc/bashrc——》/etc/profile.d/*.sh
編輯配置檔案生效的方式:
重新啟動shell程序:重新登入
使用source或. 進行(但是有副作用)
Bash中進行算數運算
+ - * / %取模(求餘數) **
let命令
實現算數運算:
1、let 算式表示式:var=算數表示式
let sum=$num1+$num2
echo $sum
2、直接變數賦值
var=$[算數表示式]
echo $[$num1+$num2]
3、變數儲存
Var=$((算數表示式))
Echo $(($num1+$num2))
4、命令引用
Var=$(expr arg1 arg2 arg3 …….)
Sum2=$(expr $num1 \* $num2) *星號要轉義
Bash的內建的隨機數生成器:$RANDOM 1-32767
echo $[$RANDOM60] 零到五十九之間的
echo $[$RANDOM60+1] 一到60之間
增強型賦值符號
+= -= *= /= %=
自增、自減運算
let var+=1 等於 let var++(加一的簡寫)
let count+=1 let count++
let count-=1 let count--
條件測試:
判斷某需求是否滿足,需要有測試機制實現:
Note:專用的測試表達式需要有測試命令輔助完成測試過程
測試命令
Test 1 –gt 3 1大於3
Test 1 –lt 3 1小於3
Test EXPRESSION
[ EXPRESSION ] 必須要有空格
[[ EXPRESSION ]]
Bash的測試型別
數值測試:
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
字串測試(數量大小)
==/= 等值測試,是否等於
>是否大於
< 是否小於
!= 是否不等於
=~ 左側的字串是否能被右側的PATTERN(模式)所匹配
=~ 一般用於[[ ]]中
-z “STRING” 測試字串是否為空,空則為真
-n “STRING” 測試字串是否不為空,不空則為真
note:用於字串比較時的用到的運算元都應該使用引號
例項:
name=Obama
[ -z '$name' ]非空,值為假
echo $?
[ -z '$myname' ] 空,值為真
echo $?
[ '$name' == '$myname' ] 兩個字串是否相等
echo $?
[[ '$name' =~ 'O.*' ]]檢視是否以字母O開頭
檔案測試:
Bash自定義退出狀態碼
exit [n]:自定義退出狀態碼
注意:指令碼中一旦遇到exit命令,指令碼會立即終止,終止退出狀態取決於exit命令後面的數字
注意:如果未給指令碼指定退出狀態碼,整個指令碼的退出狀態取決於指令碼中執行的最後一條命令的狀態碼,
練習:
接受一個檔案路徑作為引數:
如果引數個數小於1,則提示使用者“至少應該給一個引數”,並立即退出
如果引數個數不小於1,則顯示第一個引數所指向的檔案中的空白行數
提示:[ $# -lt 1 ] && echo "At least one argument." && exit 1
vim編輯器:
vi:visual interface 文字編輯器
文字:ASCII,Unicode編碼的檔案
文字編輯器的種類:
行編輯器:sed
全屏編輯器:nano,vi
VIM = VI IMproved
使用
Vim是模式化的編輯器
編輯模式:
輸入模式:
末行模式(預設模式):
內建的命令介面
開啟檔案:
Vim [OPTION] file
+num ;開啟檔案後,直接讓游標處於第N行的行首
+/PATTERN:開啟檔案後,直接讓游標處於第一個被PATTERN匹配到的行的行首
vim + /etc/passwd 直接處於行尾
模式轉換:
編輯模式——>輸入模式
i:insert,在游標所在前插入
a:append,追加,在游標後插入
o:在當前游標所在行的下方新增一行空行
I:在當前游標所在行的行首輸入
A:在當前行的行尾新增
O:在當前行的行上方新增一行空行
c:修改
C:
輸入模式-->編輯模式
esc
編輯模式-->末行模式
:
末行模式-->編輯模式
esc
末行模式不能直接到輸入模式
關閉檔案:
:q 退出
:wq 儲存退出
:wq!強制儲存退出
:q!強制退出,丟棄修改
:x 儲存退出
:w /PATH/TO/SOMEWHERE 所有內容儲存在該路徑下
ZZ儲存退出
游標跳轉
字元間的跳轉
h,j,k,l
h:左
l:右
j:下
k:上
#COMMAND:一次跳過由#指定個數的字元
單詞間的跳轉:
w:下一個單詞詞首
e:當前或下一個單詞的詞尾
b:當前或前一個單詞的詞首
#COMMAND:由#指定一次舔磚的單詞數
行首行尾跳轉:
^:跳轉至行首的第一個非空白字元
0:跳轉至行首
$:跳轉至行尾,有空白字元在空白字元最後
行間的移動
#G:跳轉到第#行
G:最後一行
gg:到達第一行
句間移動
(前一句
)後一句
段落間移動:
}後一段
{前一段
Vim的編輯命令
x:刪除單個字元
#x:刪除游標後#個字元
xp:交換游標所在的字元及其後面的字元的位置
刪除:
d:刪除,可結合游標跳轉字元,實現範圍刪除
d$游標到行尾刪除
d^游標到行首刪除
d0
dw
de
db
#COMMAND
dd刪除游標所在的一整行
#dd多行刪除,刪除#行
D留空白行
刪除的內容會存放在vim編輯的緩衝區
貼上(p,put,paste)
p:緩衝區存的如果為整行,則貼上在當前游標所在行的下方,否則貼上在游標處的後面
P:緩衝區存的如果是整行,則貼上在光標出的上方,否則貼上在游標的前面
複製命令:(y,yank)
y:與d命令相似
y$
y0
y~
ye
yw
yb
#COMMAND
yy複製一整行
#yy:複製多行
改變命令(c,change)
c修改,能從編輯模式轉為輸入模式
c$
C0
C^
cb
ce
cw
#COMMAND
Cc直接刪除並修改行
#cc
替換(r,replace)
r 替換游標所在處的字元
r+替換的內容
數字r+內容:全換為該內容
視覺化模式:
v:按字元選定
V按行選定
note:經常結合編輯命令使用
撤銷操作
u :(undo):撤銷側前的操作
#u:指定次數
撤銷此之前的撤銷:Ctrl+r
. 點號,重複上一次操作
翻屏操作
Ctrl+f 向尾部翻一屏
Ctrl+b向首部翻一屏
Ctrl+d向尾部翻半屏
Ctrl+u向首部翻半屏
vim自帶的練習教程vimtutor
Vim的末行模式:內建的命令列介面
地址定界
:start_pos,end_pos
#: 具體的第#行,例如:2表示第二行
#,#:從左側#表示起始,到右側#表示
#,+#:左側表示行起始,移動右側個數的行數
. 當前行
$最後一行
.,$-1當前行到倒數第2行
%全文
1,$
/pat1/,/pat2/ :
從第一次被pat1模式匹配到的行到第一次被pat2匹配的行 結束
#,/pat/
/pat/,$
使用方式
後跟一個編輯命令
d
y
#w /PATH/TO/SOMEHERE將範圍內的行另存至指定的檔案內
#r /PATH/FROM/somefile 在指定位置插入指定檔案中的所有內容
查詢:
/PATTERN 從當前游標所在處向檔案尾部查詢
例/\<r..t\> 查詢r..t
?PATTERN 向首部查詢
n與命令同方向
N與命令反方向
查詢並替換:
s:在末行模式,完成查詢替換操作
s/查詢的內容/替換的內容/修飾符
要查詢的內容:可使用模式,可以使用正則表示式,
替換的內容:不可使用模式,但可以使用\1,\2……等後引用符號,還可以使用&引用前面呢查到的內容
修飾符:
i忽略大小寫
g全域性替換,預設每行只替換第一次出現
例子:
:.,$s/r\(..\)t/R\1T/g 將r和t改為大寫,中間的內容不變
:%s/linux/linuxer
:%/l..x/&er/g 在l..x後新增er
:1,10s/how/HOW/g (不加g只替換一次)
:%s/\/etc\/fstab/\/var\/log/g
/必須轉義
查詢替換的分隔符/可替換為其他字元,例如
s###
:%[email protected]/var/[email protected]/etc/[email protected]
多檔案模式
vim filename1 filename2 ……..
:Next切換為下一個檔案
:prev前一個
:first第一個
:last最後一個
:wall儲存所有
:qall退出所有
視窗分割模式
Vim –o|-O file1 file2….
-o水平分割
-O垂直分割
在視窗間切換:ctrl+w,再按箭頭
單檔案視窗的分割
Ctrl+w,再按s:split,水平分割
Ctrl+w,再按v:vertical 垂直分割
定製vim的工作特性
配置檔案: 永久有效
全域性:/etc/vimrc
個人:~/.vimrc(需要建立)
末行模式只是當前有效
vim ~/.vimrc
set nu
1、行號:
Set number 顯示行號 set nu
Set nonumber 取消顯示 set nonu
2、括號匹配:
匹配:set showmatch簡寫為set sm
取消:set nosm
3、自動縮排:
啟用set ai
禁用set noai
4、高亮搜尋顯示:
啟用set hlsearch 縮寫 set hl
關閉set nohlsearch
5、語法高亮
開啟:syntax on
禁用:syntax off
6、忽略字元大小寫(預設不會忽略)
啟用:set ic
不會略:set noic
獲取幫助:
:help
:help subject
問題:如何設定tab縮排為4個字元?
練習:
1、複製/etc/rc.d/init.d/function檔案至/tmp目錄,替換/tmp/functions檔案的/etc/sysconfig/init為/var/log
2、刪除/tmp/functions檔案中所有以#開頭,且後面至少有一個空白字元的#號。
Bash條件測試
測試方式:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
測試表達式:
數值比較:
字串比較:
檔案測試:
存在性測試
-a FILE:與-e相同
-e FILE:檔案存在性測試,存在則為真,否則為假。
[ -e /etc/grub2.cfg ]
echo $? 輸出為0則存在,其他不存在
檔案存在及類別測試:
-b FILE:存在且為塊裝置檔案
-c flie:是否存在且為字元裝置檔案
-d file:是否存在且為目錄檔案
-f file:是否存在且為普通檔案
-p file:命名管道檔案
-h flie -L file:符號連線檔案
-S file:套接字檔案
檔案特殊許可權測試
-g file:檔案存在,是否設定了sgid
-u file:檔案存在,是否設定了suid
-r file:檔案存在,是否設定了可讀許可權
-w file:檔案存在,是否設定了可寫許可權
-x file:檔案存在,是否設定了可執行許可權
-k file:檔案存在,是否設定了sticky許可權
檔案大小測試
-s file:檔案是否存在,且非空
檔案是否開啟
-t fd:fd表示檔案描述符是否開啟,且與某終端相關
-G file:當前使用者是否為檔案的屬組
-N file:檔案自從上一次讀取過是否修改過
-O file:當前使用者是否為檔案的屬主
fiel1 -ef file2 檔案是否為同一個裝置的同一個檔案,inode號相同
file1 -nt file2 file1是否新與file2
file1 -ot file2 file1是否舊與file2
例如:確定一個檔案
[ -e file] || COMMAND
組合測試條件:
將多個條件做邏輯運算:
兩種方式:
第一種方式
&& COMMAND1 && COMMAND2
|| COMMAND1 || COMMAND2
! !COMMAND
存在且可讀:[ -e file ] && [ -e file ]
第二種方式:
EXPRESSION1 -a EXPRESSON2 與運算 (expression表示式)
方法:前面加text或[expression]
EXPRESSION1 -o EXPRESSON2 或運算
! EXPRESSION1 非運算
第二種方式必須使用測試命令,用於中括號內
例子:
1、判斷主機名是否為空,或者為localhost.localhost
hostName='hostname'
[ -z "$hostName" ] || [ "$hostName" == "localhost.localhost"] && hostname www.123.com
echo $?
hostname
2、cat是否存在,且為可執行檔案
[ -f /bin/cat -a -x /bin/cat] && cat /etc/fstab
3、測試一個使用者對一個檔案是否是及不可讀,又不可寫
[ ! -r /tmp/file.txt -a ! -w /tmp/file.txt ] 管理員root去掉也會有,普通使用者不會有
[ ! -r /tmp/file.txt ] && [ -w /tmp/file.txt ]
[ !\( -r /tmp/file.txt -o -w /tmp/file.txt \)] 要是用-o
echo $?