vim編輯器
文本編輯器:
文本:純文本,ASCII text;Unicode
文本編輯種類(lèi):
行編輯器:sed
全屏編輯器:nano, vi
vi: Visual Interface
vim: Vi IMproved
vim:
基本模式:
編輯模式,命令模式
輸入模式:
莫行模式:
內(nèi)置的命令行接口;
打開(kāi)文件:
vim [options]
+#:打開(kāi)文件后,直接讓光標(biāo)處于第#行的行首
+/PATTERN:打開(kāi)文件后,直接讓光標(biāo)處于第一個(gè)被PATTERN匹配行的行首
模式轉(zhuǎn)換:
編輯模式:默認(rèn)模式
編輯模式-->輸出模式;
i: insert ,在光標(biāo)所在處輸入
a: append ,在光標(biāo)所在處后方輸入
o:在光標(biāo)所在處下方打開(kāi)的一個(gè)新行
I:在光標(biāo)所在行的行首輸入
A:在光標(biāo)所在處后方輸入
O:在光標(biāo)所在處的上方打開(kāi)一個(gè)新的行輸入模式-->編輯模式
esc
編輯模式-->末行模式
:
末行模式--> 編輯模式
esc
關(guān)閉文件:
ZZ 保存并退出;
:q 退出
:q! 強(qiáng)制退出,不保存此前的編輯操作
:wq 保存退出
保存并退出
:w /PATH/TO/SOMEFILE
光標(biāo)跳轉(zhuǎn):
字符間跳轉(zhuǎn)
h:左
j:下
k:上
l : 右
# COMMAND:跳轉(zhuǎn)由# 指定的個(gè)數(shù)的字符
單詞間跳轉(zhuǎn)
w:下一個(gè)單詞的詞首
e: 當(dāng)前或后一個(gè)單詞的詞尾
b: 當(dāng)前或前一個(gè)單詞的詞首
行首行尾跳轉(zhuǎn)
^: 跳轉(zhuǎn)至行首的第一個(gè)非空白字符
0:跳轉(zhuǎn)至行首
$:跳轉(zhuǎn)至行尾
行間跳轉(zhuǎn)
#G:跳轉(zhuǎn)至由#指定的行
1G,gg :第一行
G:最后一行
句間跳轉(zhuǎn)
)
(
段間跳轉(zhuǎn)
}
{
翻屏:
Ctrl+f:向文件尾部翻一屏
Ctrl+b:向文件首部翻一屏
Ctrl+d:向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
Enter:按行向后翻
vim的編輯命令:
字符編輯
x:刪除光標(biāo)所在處的字符
#x:刪除光標(biāo)所在處起始的#個(gè)字符
xp:交換光標(biāo)所在處的字符與其后面的字符的位置
替換命令(replace):
r:替換光標(biāo)所在處的字符
刪除命令
d:刪除命令,可結(jié)合光標(biāo)跳轉(zhuǎn)字符,實(shí)現(xiàn)范圍刪除
d$
d^
dw
de
db
#COMMAND
dd:刪除光標(biāo)所在處的行
#dd:刪除光標(biāo)所處的行起始的共#行
粘貼命令(p,put,paste)
p:緩沖區(qū)的內(nèi)容,如果為整行,則粘貼在當(dāng)前光標(biāo)所在行的下方;否則在光標(biāo)所在后方粘貼
P: 緩沖區(qū)的內(nèi)容,如果為整行,則粘貼在當(dāng)前光標(biāo)所在行的上方;否則在光標(biāo)所在前方粘貼
復(fù)制命令(yank,y)
y: 復(fù)制,工作行為相似于d命令
y$
y^
y0
ye
yw
yb
#COMMAND
yy:復(fù)制一整行
#yy:復(fù)制#行
改變命令(change,c)
編輯模式-->輸入模式,實(shí)現(xiàn)刪除操作
c$
c^
c0
cb
ce
cw
#COMMAND
cc:刪除光標(biāo)所在的行,并轉(zhuǎn)換為輸出模式
#cc
其他編輯操作:
可視化模式:
v: 按字符選定
V:按行選定
結(jié)合編輯命令使用d,c,y
撤銷(xiāo)(undo)操作:
u:撤銷(xiāo)此前的操作
#u: 撤銷(xiāo)此前的#個(gè)操作
恢復(fù)此前的撤銷(xiāo):
Ctrl +r
重復(fù)執(zhí)行前一個(gè)編輯操作:.
vim自帶的練習(xí)教程:vimtutor
vim末行模式:
內(nèi)建的命令行接口
(1)地址定界
:start_pos[,end_pos]
#: 特定的第#行,例如5即第5行
.:當(dāng)前行
$:最后一行
#,#:指定行范圍,左側(cè)為起始行,右測(cè)為結(jié)束行
#,+#:指定行范圍,左側(cè)為初始行絕對(duì)編號(hào),右側(cè)為相對(duì)左側(cè)行號(hào)的偏移量;例如:3,+7
1,$
%:全文
/pattern/:從光標(biāo)所在處初始向文件尾部第一次被模式所匹配到的行
/first/,$
/part1/,pat2/:從光標(biāo)所在處起始,第一次由part1匹配到的行開(kāi)始,至第一次由part2匹配到的行結(jié)束之間的所有行 ;
可同編輯命令一同使用,實(shí)現(xiàn)編輯操作;
d
y
c
w/PATH/TO/SOMEFILE:將范圍內(nèi)的文本保存至指定的文件中
r /PATH/FROM/SOMEFILE:將指定的文件中的文本讀取并插入至指定位置(2)查找
/PATTERN:從當(dāng)前光標(biāo)所在處向文件尾部查找能被當(dāng)前模式匹配到的所有字符串
?/PATTERN:從當(dāng)前光標(biāo)所在處向文件首部查找能被當(dāng)前模式匹配到的所有字符串
n:下一個(gè),與命令方向相同
N:上一個(gè),與命令方向相反
(3)查找并替換
s: 末行模式的命令;使用格式;
s/要查找的內(nèi)容/替換為的內(nèi)容/修飾符
要查找的內(nèi)容:可使用正則表達(dá)式
替換為的內(nèi)容:不能使用正則表達(dá)式,但可以引用
如果“要查找的內(nèi)容”部分在模式中使用分組符好;再“替換為的內(nèi)容”中使用后向引用;
直接引用查找模式匹配到的全部文本;要使用&符號(hào)
修飾符:
i: 忽略大小寫(xiě)
g: 全局替換,意味著一行中如果匹配到多次,則均替換
可把分隔符替換為其它字符
s@@@
@###
示例:
1、所有以f開(kāi)頭的單詞替換為F
%s@\<f\([[:alpha:]]\+\)\>@F\1@g
2、所有以f或F開(kāi)頭的單詞后面加上TEST
%s@\<f[[:alpha:]]\+\>@&TEST@gi
練習(xí):
1、復(fù)制/etc/grub.conf文件至/tmp目錄中,用查找替換命令刪除/tmp/grub.conf文件中以空白字符開(kāi)頭的行的行首的空白字符;
%s@^[[:space:]]/+@@
2、復(fù)制/etc/rc.d/init.d/functions文件移動(dòng)至/tmp目錄中,用查找替換命令為/tmp/functions文件的每個(gè)以空白字符開(kāi)頭的行的行首加上#
%s@^[[:space:]]@#&@g
%s@^[[:space:]]\+[[:space:]]@#&@g
3、為/tmp/grub.conf文件的前三行的行首加上#號(hào)
1,3s@^.*$@#&@
4、將/etc/yum.repos.d/Censtos-Base.repo文件中所有的enabled=0替換為enabled=1,所有g(shù)pgcheck=0替換為gpgcheck=1
%s@\(enabled\|gpgcheck\)=0@\1=1@g
vim多文件功能:
vim FILE1 FILE2
在文件間切換:
:next 下一個(gè)
:prev 上一個(gè)
:first 第一個(gè)
:last 最后一個(gè)
退出所有文件:
:wqall 保存所有文件并退出
:wall
:qall
多寬口:
-o: 水平分隔窗口
-O:垂直分隔窗口
在窗口間切換:Ctrl+w,ARROW
注意:?jiǎn)蝹€(gè)文件也可以分隔為多個(gè)窗口
ctrl +w,s: 水平分隔窗口
ctrl +w , v: 垂直分隔窗口
定制vim的工作特性:
注意:在末行模式下設(shè)定,僅對(duì)當(dāng)前vim進(jìn)程有效
永久有效:
全局:/etc/vimrc
用戶(hù)個(gè)人:~/.vimrc
1、行號(hào)
顯示:set number,簡(jiǎn)寫(xiě)為set nu
取消顯示:set nomber, set nonu
2、括號(hào)匹配高亮
匹配:set showmatch ,set sm
取消:set nosm
3、自動(dòng)縮進(jìn)
啟用:set ai
禁用:set noai
4、高亮搜索
啟用:set hlsearch
禁用:set nohlsearch
5、語(yǔ)法高亮
啟用:syntax on
禁用:syntax off
6、忽略字符大小寫(xiě)
啟用:set ic
禁用:set noic
獲取幫助:
:help
:help subject
作業(yè):如何設(shè)置tab建縮進(jìn)4個(gè)字符
練習(xí):寫(xiě)一個(gè)腳本,完成如下功能
添加三個(gè)用戶(hù);
求此三個(gè)用戶(hù)ID之和
#i/usr/bash
for((i=1;i<=3;i++));do
username="user$i"
useradd "$username"
echo "$username" | passwd --stdin $username
num=$(id -u "$username")
let sum=sum+$num
done
echo $sum
文件查找
在文件系統(tǒng)上查找符合條件的文件
實(shí)現(xiàn)工具:locate,find
locate命令:
依賴(lài)于事先構(gòu)建好的索引庫(kù);
系統(tǒng)自動(dòng)實(shí)現(xiàn)(周期性任務(wù));
手動(dòng)更新數(shù)據(jù)庫(kù)(updatedb);
工作特性:
查找速度快;
模糊查找;
非實(shí)時(shí)查找;
locate [OPTION]... PATTERN...
-b:只匹配路徑中的基名
-c:統(tǒng)計(jì)出共有多少個(gè)符合條件的文件
-r:BRE正則表達(dá)式
注意:索引構(gòu)建果茶需要遍歷整個(gè)根文件系統(tǒng),及消耗系統(tǒng)資源
find命令:
實(shí)時(shí)查找工具,通過(guò)遍歷指定起始路徑下文件系統(tǒng)層級(jí)結(jié)構(gòu)完成文件查找
工作特性:
查找速度略慢
精確查找
實(shí)時(shí)查找
用法:
find [OPTIONS] [查找起始路徑] [查找條件][處理動(dòng)作]
查找起始路徑:指定具體搜索目錄起始路徑;
查找條件:指定的查找標(biāo)準(zhǔn),可以根據(jù)文件名、大小、類(lèi)型、權(quán)限等等標(biāo)準(zhǔn)進(jìn)行;默認(rèn)為找出指定路徑下的所有文件;
處理動(dòng)作:對(duì)符合查找條件的文件做出操作,例如刪除等操作;默認(rèn)為輸出至標(biāo)準(zhǔn)輸出;
查找條件:
表達(dá)式:選項(xiàng)和測(cè)試
測(cè)試:結(jié)果通常為布爾型(“true”“false”)
根據(jù)文件名查找:
-name pattern
-iname pattern支持glob風(fēng)格的通配符
*,?,[],[^]
-regex pattern: 基于正則表達(dá)式模式查找文件,匹配是整個(gè)路徑,而非其名
根據(jù)文件從屬關(guān)系查找:
-user USERNAME: 查找屬主指定用戶(hù)的所有文件;
-group GRPNAME: 查找屬組指定組的所有文件;
-uid UID: 查找屬主為指定UID的所有文件;
-gid GID: 查找屬組指定GID的所有文件;
-nouser: 查找沒(méi)有屬主的文件
-nogroup: 查找沒(méi)有屬組的文件
根據(jù)文件的類(lèi)型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號(hào)鏈接文件
b: 塊設(shè)備文件
c: 字符設(shè)備文件
p: 管道文件
s: 套接字文件
組合測(cè)試:
與:-a,默認(rèn)組合邏輯
或:-o
非:-not,!
練習(xí):
1、找出/tmp目錄下屬主為非root的所有文件
find /tmp -not -user root
2、找出/tmp目錄下文件名中不包含fstab字符串的文件
find /tmp -not -name "*fstab*"
3、找出/tmp目錄下屬主為非root,而且文件名不包含fstab字符串的文件
find /tmp -not -user root -a -not -iname "*fstab*"
find /tmp -not \( -user root -o -iname "*fstab*" \)
!A -a !B=!(A -o B)
!A -o !B=!(A -a B)
根據(jù)文件的大小查找:
-size [+|-]#UNIT
常用單位:k, M, G
#UNIT:(#-1,#]
-#UNIT:[0,#-1]
+#UNIT:(#,oo)
根據(jù)時(shí)間戳查找:
以“天”為單位
-atime[+| -]# 訪(fǎng)問(wèn)時(shí)間
#:[#,#-1)
-#:(#,0]
+#:(oo,#-1)
-mtime 修改時(shí)間
-ctime 改變時(shí)間
以“分鐘”為單位
-amin
-mmin
-cmin
根據(jù)權(quán)限查找:
-perm[/|-]:
mode:精確權(quán)限匹配
/mode: 任何一類(lèi)用戶(hù)(u,g,o)的權(quán)限中的任何一位(r,w,x)符合條件即可滿(mǎn)足;
9位權(quán)限直接存在“或”關(guān)系;
-mode: 每一類(lèi)用戶(hù)(u,g,o)的權(quán)限中每一位(r,w,x)同時(shí)符合條件即滿(mǎn)足;
9位權(quán)限之間存在“與”關(guān)系;
處理動(dòng)作:
-print: 輸出至標(biāo)準(zhǔn)輸出;默認(rèn)的動(dòng)作;
-ls :類(lèi)似于對(duì)查找到的文件執(zhí)行“l(fā)s-l”命令,輸出文件的詳細(xì)信息;
-delete : 刪除查找到的文件;
-fls /PATH/TO/SOMEFILE: 把查找到的所有文件的長(zhǎng)格式信息保存至指定文件中
-ok COMMAND {} \; :對(duì)查找到的每個(gè)文件執(zhí)行由COMMAND表是的命令;每次操作都由用戶(hù)確認(rèn)
-exec COMMAND {} \; :對(duì)查找到的每個(gè)文件執(zhí)行由COMMAND表是的命令;每次操作不需要用戶(hù)確認(rèn);
注意:find傳遞查找到的文件路徑至后面的命令時(shí),是先查找出所有符合條件的文件路徑,并以此性傳遞給后面的命令;
但是有些命令不能接受過(guò)長(zhǎng)的參數(shù),此時(shí)命令執(zhí)行會(huì)失敗;另一種方式可規(guī)避此問(wèn)題:
linux下刪除亂碼文件名:
1. ls -i 列出文件的節(jié)點(diǎn)ID, 如: 123456789
2. find ./ -inum 123456789 -print -exec rm -rf {} \;
find | xargs COMMAND
課外作業(yè):學(xué)習(xí)xargs命令的用法
練習(xí):
1、查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄
find /var -user root -a -group mail -ls
2、查找/usr目錄不屬于root,bin或hadoop的所有文件或目錄;用兩種方法
find /etc -not \( -user root -o -user bin -o -user hadoop \)
find /etc -not -user root -a -not -user bin -a -not -user hadoop
3、查找/etc目錄下最近一周內(nèi)其內(nèi)容修改過(guò),且屬主不是root用戶(hù)也不是hadoop用戶(hù)的文件或目錄
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
find /etc -mtime -7 -a not -user root -a -user hadoop
4、查找當(dāng)前系統(tǒng)上沒(méi)有屬主或?qū)俳M,且最近一周內(nèi)曾被訪(fǎng)問(wèn)過(guò)的文件或目錄
find / -atime -7 -a -nouser -o -nogroup -ls
5、查找/etc目錄下大于1M且類(lèi)型為普通文件的所有文件
find /etc -size +1M -a -type f -exec ls -lh {} \;
6、查找/etc目錄下所有用戶(hù)都沒(méi)有寫(xiě)權(quán)限的文件
find /etc not -perm /222 -type f -ls
7、查找/etc目錄至少有一類(lèi)用戶(hù)沒(méi)有執(zhí)行權(quán)限的文件
find /etc -not -perm -111 type f -ls
8、查找/etc目錄下,所有用戶(hù)都有執(zhí)行權(quán)限,且其他用戶(hù)有寫(xiě)權(quán)限的所有文件
find /etc -perm -111 -a -perm -002 -type f -ls
find /etc -prem -113 -type f
Linux系統(tǒng)上的特殊權(quán)限
特殊權(quán)限:SUID ,SGID ,STICKY
安全上下文:
1、進(jìn)程以某用戶(hù)的身份運(yùn)行;進(jìn)程是發(fā)起此進(jìn)程用戶(hù)的代理,因此以此用戶(hù)的身份和權(quán)限完成所有操作。
2、權(quán)限匹配模型:
(1)判斷進(jìn)程的屬主,是否為被訪(fǎng)的文件的屬主;如果是,則應(yīng)用屬主的權(quán)限;否則進(jìn)入第2步;
(2)判斷進(jìn)程的屬主,是否屬于被訪(fǎng)問(wèn)的文件屬組;如果是,則應(yīng)用屬組的權(quán)限,否則進(jìn)入第3步
(3)應(yīng)用other的權(quán)限
SUID:
默認(rèn)情況下:用戶(hù)發(fā)起的進(jìn)程,進(jìn)程的屬主是其發(fā)起者;因此,其以發(fā)起者的身份在運(yùn)行;
SUID的功用:用戶(hù)運(yùn)行某程序時(shí),如果此程序擁有SUID權(quán)限,那么程序運(yùn)行為進(jìn)程時(shí),進(jìn)程的屬主不是發(fā)起者,而是程序文件自己的屬主。
管理文件的SUID權(quán)限:
chmod u+|-s FILE...
展示位置:屬主的執(zhí)行權(quán)限位
如果屬主原本有執(zhí)行權(quán)限,顯示為小寫(xiě)s;
否則,顯示為大寫(xiě)s;
SGID:
功用:當(dāng)目錄屬組有寫(xiě)權(quán)限,且有SGID權(quán)限時(shí),那么所有屬于此目錄的屬組,且以屬組身份在此目錄中新建文件或者目錄時(shí),新文件的屬組不是用戶(hù)的基本組,而是此目錄的屬組。
管理文件的SGID權(quán)限:
chmod g+|-s FILE...
展示位置:展示于屬組執(zhí)行權(quán)限位
如果屬主原本有執(zhí)行權(quán)限,顯示為小寫(xiě)s;
否則,顯示為大寫(xiě)s;
Stikcy:
功用:對(duì)于屬組或全局可寫(xiě)的目錄,組內(nèi)的所有用戶(hù)或系統(tǒng)上的所有用戶(hù)對(duì)此目錄中都能創(chuàng)建新件或者刪除所有的已有文件;如果為此目錄設(shè)置Sticky權(quán)限,則每個(gè)用戶(hù)能創(chuàng)建新文件,且只能刪除自己的權(quán)限。
管理文件的Sticky權(quán)限:
chmod o+|-t FILE
展示位置:其它用戶(hù)的執(zhí)行位
如果其他用戶(hù)原本有執(zhí)行權(quán)限,顯示為小寫(xiě)t;
否則,顯示為大寫(xiě)T
系統(tǒng)上的/tmp和/var/tmp目錄默認(rèn)均有sticky權(quán)限;
管理特殊權(quán)限的另一方式:
suid sgid sticky 八進(jìn)制權(quán)限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基于八進(jìn)制方式賦權(quán)時(shí),可于默認(rèn)的三位八進(jìn)制數(shù)字左側(cè)再加一位八進(jìn)制數(shù)字;
例如:chmod 1777
facl: file access control lists
文件的額外賦權(quán)機(jī)制:
在原有的u,g,o之外,另一層讓普通用戶(hù)能控制賦權(quán)給另外的用戶(hù)或組的賦權(quán)機(jī)制;
getfacl命令:
getfacl FILE....
user:USERNAME:MODE
group:GROUPNAME:MODE
setfacl命令:
賦權(quán)給用戶(hù):
setfacl -m u:USERNAME:MODE FILE...
賦權(quán)給組:
setfacl -m u:GROUPNAME:MODE FILE...
撤銷(xiāo)賦權(quán):
setfacl -x u:USERNAME FILE...
setfacl -x g:GROUPNAME FILE...