文章目錄
- Linux 基本指令
- 前序
- Vim
- 編輯器分為兩種
- 設計理念
- 模式
- 轉化指令解釋
- Normal模式
- 移動光標(motion 核心)
- 常用指令
- 動作(action)
- 常用指令
- 將動作與移動進行組合
- 查找(正則表達式)
- 替換(substitude)
- 文本對象
- action + textobj
- 文本對象與motion的區別
- 多窗口
- 對文件的操作
- 常用指令
- 視圖模式(visual)
- 批量注釋
- Linux模型(體系結構)
- 用戶子系統命令
- linux用戶
- 命令
- 常用命令
- 查看幫助手冊
- 文件子系統
- 常見目錄
- 與目錄有關的指令
- 查看當前工作目錄(pwd)
- 改變當前工作目錄(cd)
- 創建目錄(mkdir)
- 刪除空目錄(rmdir)
- 通配符
- 查看目錄內容(ls)
- 查看目錄項的詳細信息
- 以樹狀結構顯示目錄內容(tree)
- 復制文件或目錄(cp)
- 文件和目錄的移動或重命名(mv)
- 刪除文件和目錄(rm)
- 文件相關指令
- 創建文件
- 查找文件
- which
- find
- 查看文件內容
- cat
- head
- tail
- less(more)
- 重定向
- 搜索文件內容
- grep
- 正則表達式
- 命令的組合
- |(管道)
- 改變文件權限
- chmod
- 文件創建掩碼
- umask
- 鏈接
- ln
- 遠程復制
- scp
- 打包壓縮
- tar(text archive)
- 別名
- alias
Linux 基本指令
前序
如果使用虛擬機
? 在關機之前要先將虛擬機關閉
- shutdown
- -h --halt
- Halt the machine(停止系統并關閉電源 加 now 會馬上關機如果在服務器等環境中只是停止系統運行,不會直接切斷電源)
- -p --poweroff
- Power-off the machine(默認)
- -r --reboot
- Reboot the machine(重啟計算機)
- -c
- Cancle a pending shutdown(取消關機)
- -h --halt
Vim
編輯器分為兩種
-
所見及所得(編輯模式)
-
多模式(在不同模式下,可以左不同的事情)
設計理念
- 組合
- 例如在 Vim 中,“d” 表示刪除,“j” 移動到下一行,組合 “dj” 表示刪除當前行和下一
行;“^” 代表行首,故組合 “d^” 表示刪除到行首;“ " 代表行尾, " d " 代表行尾,"d "代表行尾,"d” 表示刪除到
行尾。而且我們還可以指定命令重復的次數:“dd” 表示刪除光標所在行,“2dd” 或
“d2d” 表示連續刪除兩行,效果和 “dj” 一致。
- 例如在 Vim 中,“d” 表示刪除,“j” 移動到下一行,組合 “dj” 表示刪除當前行和下一
- 簡單,快捷
模式
Vim 有多種模式,最常用的是:普通(命令)模式、插入(編輯)模式和視圖模式。這些模式之間可以相互轉換,如下圖所示:
-
普通模式(Normal)
-
視覺模式(又叫視圖模式)
-
插入模式
轉化指令解釋
- 普通模式轉插入模式
- i (insert) : 在光標前面插入
- a(after) : 在光標后面插入
- I(大寫) :在行首插入
- A :在行尾插入
- o(open) : 在下面另起一行插入
- O : 在上面另起一行插入
- 普通模式轉視覺模式
- v ( visual) :行選
- [ctrl + v ] (v-Block) : 豎選
Normal模式
Normal 又叫命令模式,就是用來執行命令的模式。
- 命令
- 短命令
- i a o等命令
- 底部命令(長命令)
- :wq[enter]
- 短命令
移動光標(motion 核心)
常用指令
-
h :向左移動
-
j : 向下移動
-
k:向上移動
-
i : 向右移動
-
[n] - : 向上移動 n 行
-
[n] + : 向下移動 n 行
-
:[n] ([n]G):移動到第n行
-
gg : 到文件的第一行
-
G : 到文件的最后一行
-
0 : 將光標移動到行首
-
^ : 移動到第一個非空白字符
-
$ : 行尾
-
w (word) : 下一個詞首
- W (與小寫的w的劃分方式不同 單詞與單詞之間以空白字符分割) : 下一個詞首
-
b (before) : 上一個詞首
- B(同上): 上一個詞首
-
t(to): t) 向后查找,將光標移動到)的前一個字符
- T :T" 向前查找,將光標移動到 “ 的后一個字符
-
f(find):向后查找,將光標移動到)
- F : T" 向前查找,將光標移動到 “
動作(action)
常用指令
-
d (delete) : 刪除
-
y (yank) : 復制
-
c ( change): 刪除并進行插入模式
-
u (undo) : 撤銷
-
[ctrl ] + r (recovery) : 恢復
-
p / P (paste) : 粘貼
將動作與移動進行組合
- 刪除(delete)文本
Vim 中的刪除類似 Windows 中的剪切,會將刪除的內容復制到 Vim 的"剪切板"中。
- 復制(yank)文本
- 修改文本
查找(正則表達式)
- /pattern : 向下查找 pattern為正則表達式 可以簡單先理解為要查找的字段
- ?pattern:向上查找
- n :移動到下一個匹配項
- N : 移動到上一個匹配項
替換(substitude)
因為linux操作系統循序 最小前綴原則 所以 :q 和 :quit 等效
-
格式:
-
😒/pattern/substitute/選項 將匹配pattern的內容替換為substitute
-
😒/pattern/substitute 只會替換光標所在行的第一個匹配項
-
😒/pattern/substitute/g 替換光標所在行的所有匹配項 (g for globally)
-
:[m],[n]s/pattern/substitute/g 替換[m,n]行的所有匹配項
-
:%s/pattern/substitute/g 替換全文的所有匹配項
-
文本對象
action + textobj
文本對象與motion的區別
- a(, a)
- 包含邊界
- a{, a}
- a[, a]
- a<, a>
- a’’
- a’
- ap (paragraph)
- p的就是空行
- i(, i)
- 不包含邊界
- i{, i}
- i[, i]
- i<, i>
- i’’
- i’
- ip (paragraph)
- p的就是空行
多窗口
對文件的操作
常用指令
- :w :將buffer里面的內容寫入文件中,即保存
- :q :退出
- :q!:不保存退出
- :wq :保存退出
- 注意:[ctrl] + s 不是保存 ,而是進入僵死狀態;[ctrl] + q 退出僵死狀態
視圖模式(visual)
批量注釋
-
原生方法
- [ctrl] + v 切換為豎選模式
- 選擇要注釋的范圍
- 輸入I 切換為插入模式
- 輸入//
- 輸入ESC
-
使用vimplus插件
-
gc :g表示轉義 c comment 注釋
-
gdc :注釋一行 或者 解除注釋一行(就是與motion 結合使用)
-
Linux模型(體系結構)
Linux 的體系結構源自于 Unix,主要分為三層,從內到外依次是:內核 --> 系統調用–> 應用層。
- 內核(kernel)負責兩個功能:管理計算機硬件資源;為上層應用程序提供運行環境。
- 系統調用(system calls):內核給上層應用程序提供的接口。
- 庫函數(library routines):通常我們會把系統調用封裝成庫函數,主要的目的是方便程序員使用。系統調用往往設計得比較繁瑣復雜,相對于系統調用而言,庫函數的設計會更加友好。比如: malloc 、 free 、 printf 、 scanf 等。
- shell 是一個命令行解釋器,它讀取用戶輸入,然后執行命令,然后等待用戶的下一次輸入。
shell 擁有很多版本,我們將使用 bash(Bourne-again shell),它位于/bin/bash。
用戶子系統命令
linux用戶
- root 根目錄,超級用戶 皇帝:擁有至高無上的權利
- sudoer:管理員用戶 安裝unbantu時,創建的用戶默認為sudoer
- 可以使用sudo 臨時提升自己的權利
- 太監
- 普通用戶
命令
-
查看所有用戶
-
cat /etc/passwd
-
-
每一行對應一條記錄,每條記錄有多個字段,字段之間以 : 分割。我們可以在5號手冊中查看 passwd 文件的格式和規范:
-
-
創建用戶
-
useradd [選項] username
-
常見選項
- -m – create -home
- 如果不存在,則創建用戶目錄
- -s --shell
- 用戶的登錄使用的shell
- -m – create -home
-
例子
-
sudo useradd test1 這樣創建的用戶不會自動創建用戶的家目錄,默認的shell為sh
-
$ sudo useradd -m -s /bin/bash test2 這樣創建的用戶會自動創建用戶的家目錄,并可以指定使用哪個shell
-
-
-
-
刪除用戶
-
userdel [選項] username
- 常用選項:
- -r, --remove 用戶主目錄中的文件將隨用戶主目錄和用戶郵箱一起刪除。
-
例子
-
sudo userdel test1 這樣刪除用戶,不會刪除用戶的家目錄和用戶的郵箱。
-
$ sudo userdel -r test2 這樣刪除用戶,會把用戶的家目錄和用戶的郵箱一起刪除。
-
-
-
修改用戶密碼
-
man passwd passwd 命令用來更改用戶賬戶的密碼。普通用戶通常只更改其自己賬戶的密碼,而超級用戶可以更改任何賬戶的密碼。
-
passwd [選項] [username]
-
sudo passwd test1
-
sudo passwd root
-
-
-
切換用戶
- su + 用戶
-
退出切換
- exit
常用命令
查看幫助手冊
使用 man(manual) 命令可以查看 Linux 內置的幫助手冊。該手冊分為多卷:第一卷是用來查看 shell 命令的;第二卷是用來查看系統調用相關信息的;第三卷是用來查看庫函數信息的…
-
man命令
- man [手冊編號] cmd
- man man
- man 3 mkdir
-
進入幫助頁面后,我們可以按照按下面按鍵進行操作
- d(down) 向下翻半頁
- u(up) 向上翻半頁
- f(forward) 向下翻一整頁
- b(backward)向上翻一整頁
- q ( quit ) 退出
- 還有一點 在查看手冊時,vim的motion指令也是兼容的
文件子系統
和 Windows 不一樣,Linux是以樹的結構來管理文件系統的。我們將樹的根結點稱為根目錄,用 / 表示。
常見目錄
在linux中,以分門別類的方式管理文件,也就是功能相似的文件放在同一目錄下進行管理
- /bin(binary) 存放可執行程序或者腳本文件
- /sys(system)存放和系統相關的文件
- /dev(device)存放設備文件
- /etc 一般用來存放配置文件或者啟動腳本
- /lib(library)存放系統庫文件
- /var(variable)存放變化很快的文件,比如日志文件
- /proc(process)存放進程相關數據
- /root root用戶的家目錄
- /home/{username} 普通用戶的家目錄
與目錄有關的指令
查看當前工作目錄(pwd)
- pwd(print working directory)命令可以查看當前工作目錄
改變當前工作目錄(cd)
- cd(change directory)命令可以改變工作目錄
- man cd
- cd [選項] [directory]
- cd #切換到家目錄
- cd /usr/lib #切換到/usr/libm目錄
- cd / #切換到 / 目錄
- cd ~ #切換到用戶家目錄
- cd . # 切換到當前工作目錄
- cd … #切換到父目錄
- cd - #切換到上次目錄
- 注意:上次目錄保存的環境變量OLDPWD中(可以通過env命令查看),他不是用棧結構管理的
創建目錄(mkdir)
-
mkdir
-
man mkdir
-
mkdir - make directories
-
mkdir [選項] directory …
-
-p, --parents 如果父目錄不存在,則創建父目錄
-
mkdir dir
-
mkdir dir1 dir2 dir3
-
mkdir -p a/b/c r如果父節點不存在,則創建父節點
-
刪除空目錄(rmdir)
-
rmdir (remove directory) 只能用來刪除空目錄
-
man rmdir
-
rmdir - remove empty directories
-
rmdir [選項] dirctory…
-
-p, --parents 遞歸刪除空目錄
-
rmdir dir
-
rmdir dir1 dir2 dir3
-
rmdir -p a/b/c
-
通配符
-
可以用來匹配單個或者多個字符
-
*: 匹配任意多個字符(包括0個)
-
?: 匹配任意一個字符
-
集合(類): [characters]匹配集合內任意一個字符。
-
[!characters]匹配集合外任意一個字符。 比如:[abc], [!abc], [0-9], [a-z], [0-9A-Za-z_]等
-
rmdir 命令可以和通配符一起使用 (通配符可以提升命令的威力):
-
rmdir dir? 例如:刪除dira dir1
-
rmdir dir* 例如:刪除dir開頭的所有空目錄
-
rmdir [!abc] 刪除dir開頭后面一個字符不為abc的空文件
查看目錄內容(ls)
- ls (list) 命令可以查看目錄內容
- man ls
- ls - list directory contents
- ls [選項] [FILE]…
- -a, --all 顯示所有的內容,包括以.開頭的文件和目錄
- -i, --inode 顯示文件的inode編號(inode是物理文件的標識)。
- 顯示文件 通過 inode 編號找到物理文件進行訪問
- -l 以長格式的形式顯示目錄中的內容
- -h, --human-readable 和-l選項一起使用,以人類可讀的方式顯示文件的大小。
- 常見方式
- ls # 查看當前工作目錄
- ls dir # 查看dir
- ls dir1 dir2 dir3 # 查看dir1,dir2,dir3
- ls -a dir # 查看dir中的所有內容,包括以.開頭的文件和目錄
- ls -ilh dir # 顯示inode編號,顯示詳細信息,并以人類可讀的方式顯示文件的大小
查看目錄項的詳細信息
- 第一列的第一個字母來表示文件的類型
- -: 普通文件
- d(directory): 目錄
- c(character): 字符設備文件(鼠標,鍵盤,顯示器…
- b(block): 塊設備文件(磁盤)
- l(symbolic link): 符號鏈接
- s(socket): 本地套接字
- p(named pipe): 有名管道
- 第1列后面九個字符(分為3組)表示權限。
- 依次代表擁有者、擁有組和其他用戶的讀、寫、執行權限。可讀則顯示r,可寫則顯示w,可執行則顯示x, 沒有相關權限則顯示-。 可以使用3個二進制數字表示 寫1表示存在,寫0表示-
- 第2列表示硬鏈接數。 顯示文件 通過 inode 編號找到物理文件進行訪問
- 第3列表示擁有者。
- 第4列表示擁有組。
- 第5列表示文件所占空間的大小。
- 第6列表示最近修改時間。
- 第7列為文件名。
以樹狀結構顯示目錄內容(tree)
tree 命令不是Linux系統自帶的命令,使用之前,我們必須先安裝 tree 命令
- sudo apt install tree
tree 命令可以以樹狀結構顯示目錄內容
- man tree
- tree - list contents of directories in a tree-like format.
- tree [選項] [directory]…
- tree # 以樹狀結構顯示當前工作目錄的內容
- tree dir # 以樹狀結構顯示目錄dir中的內容
- tree dir1 dir2 dir3 # 以樹狀結構顯示目錄dir1, dir2, dir3中的內容
復制文件或目錄(cp)
cp(copy) 命令可以用來復制文件和目錄。
-
man cp
-
cp - copy files and directories
-
cp [選項] source dest
-
cp [選項] source… dest
-
常用選項:
- -n, --no-clobber 如果文件已存在,則不覆蓋(默認會覆蓋已有文件)。
- -i, --interactive 如果文件存在,則給用戶提示信息(由用戶決定是否覆蓋?)
- -R, -r, --recursive 遞歸復制(用于copy目錄)
-
cp text1 text2 # 將text1復制到text2中;如果text2存在,則覆蓋。
-
cp text1 text2 text3 dir # 將text1,text2,text3復制到目錄dir中;如果文件已存在,則覆蓋。
-
cp -n text1 text2 # 將text1復制到text2中;如果text2存在,不覆蓋。
-
cp -i text1 text2 text3 dir # 將text1,text2,text3復制到目錄dir中;如果文件已存在,則提示用戶是否覆蓋。
-
cp -r dir1 dir2 # 遞歸地將目錄dir1復制到目錄dir2
文件和目錄的移動或重命名(mv)
mv(move) 命令可以用來移動文件和目錄,我們也可以用 mv 命令對文件和目錄重命名。
- man mv
- mv - move (rename) files
- mv [選項] SOURCE DEST
- mv [選項] SOURCE… DEST
- Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
- 常用選項:
- -n, --no-clobber 如果文件已存在,則不覆蓋(默認會覆蓋已有文件)。
- -i, --interactive 如果文件存在,則給用戶提示信息(由用戶決定是否覆蓋?)
為什么移動目錄時,不需要指定-r選項?
本質是修改目錄的元數據(如路徑、名稱),而非復制內容。目錄作為一個整體(包含其下所有文件和子目錄的結構)直接被 “搬遷”,無需遞歸遍歷內部內容(類似文件重命名,只是對象是目錄)
mv text1 text2 # 將text1重命名為text2;如果text2存在,
則覆蓋。
mv dir1 dir2 # 將dir1重命名為dir2
mv -n text1 text2 # 將text1重命名為text2;如果text2存在,
不覆蓋。
mv text1 text2 text3 dir # 將text1,text2,text3移動到目錄dir中;
如果文件已存在,則覆蓋。
mv -i text1 text2 text3 dir # 將text1,text2,text3移動到目錄dir中;
如果文件已存在,則提示用戶是否覆蓋。
刪除文件和目錄(rm)
rm(remove)命令可以刪除文件和目錄
$ man rm
rm - remove files or directories
格式:
rm [選項] FILE...
常用選項:
-f, --force
忽略不存在的文件,永遠不提示
-i
在每次刪除前,都提示用戶是否刪除
-r, -R, --recursive
遞歸刪除
常用方式
$ rm text1 # 刪除文件text1
$ rm text1 text2 text3 # 刪除文件text1, text2, text3
$ rm -i *.txt # 刪除當前目錄下所有以.txt結尾的文件,并提示用戶是否刪除
$ rm -rf dir # 遞歸刪除目錄dir, 不給出任何提示
mv的本質是將text1,進行復制一份與inode進行關聯,然后將原來的text1,刪除。
注意:使用rm命令刪除文件和目錄后,就很難恢復了(Linux系統沒有所謂的回收站)。所以除非必要,不要以 root 身份或者使用 sudo 權限來執行 rm 命令!
文件相關指令
創建文件
在linux下創建文件的方式有很多,常用的是以下三種方式:
$ echo "Hello Linus Torvalds" > text # 創建文件text, 并且文件中包含內容"Hello Linus Torvalds"
$ touch text1 text2 text3 # 創建空文件text1, text2, text3(要求text1,text2,text3不存在)
$ vim hello.c # 編輯hello.c, 按:wq退出。
查找文件
which
使用which命令來查找可執行程序的路徑
$ man whichwhich - locate a command
格式:which [-a] cmd...
選項:-a 顯示所有匹配的路徑 不加 -a 會找到一個之后直接返回打印到屏幕上
常用方式
$ which bash # 查看bash的路徑
$ which ls tree # 查看命令ls和tree的路徑
$ which -a vim # 查看vim的所有路徑 (我們可能裝了多個版本的vim)
which 是根據 PATH環境變量中的路徑依次進行查找的,然后顯示第一個匹配項,或者顯示全部匹配項
每條之間的分隔為:,依次查找
find
find可以在一個目錄中遞歸的查找符合指定條件的文件。它的功能非常強大。
$ man findfind - search for files in a directory hierarchy
格式:find [start-point...] 查找條件 # 省略start-point,默認起始點為當前工作目錄
常用選項:-name pattern 查找文件名符合pattern(正則表達式)的文件-type c 查找類型為c的文件:b(block): 塊設備文件c(character): 字符設備文件d(directory): 目錄p(named pipe): 有名管道f(file): 普通文件l(symbolic link): 符號鏈接s(socket): 套接字-size n[cwbkMG] (向上查找)File uses n units of space, rounding up.b: for 512-byte blocks (this is the default if no suffix is used)c: for bytesw: for two-byte wordsk: for Kibibytes (KiB, units of 1024 bytes)M: for Mebibytes (MiB, units of 1024 * 1024 = 1048576 bytes)G: for Gibibytes (GiB, units of 1024 * 1024 * 1024 = 1073741824 bytes)可以在n前面添加'+'和'-',表示大于和小于。-empty 查找空的文件或空的文件夾-user username, -uid uid 根據用戶名和用戶id查找-group groupname, -gid gid 根據組名和組id查找-perm mode 根據權限查找根據時間查找:-amin n, -atime n, -cmin n, -ctime n, -mmin n, -mtime n三個時間戳 a(access): 文件訪問的時間c(change): 文件屬性發生改變的時間 (用戶,組 ,權限)m(modify): 文件內容發生改變的時間min: 以分鐘為單位time: 以天為單位可以在n前面添加'+'和'-',表示大于和小于。組合查找:-a(and), -o(or), !(not): 分別表示與、或、非
“+” " - " 號的理解:
常用的方法
$ find /usr/include -name "stdio.h" # 在/usr/include目錄下查找stdio.h文件
$ find . -name "*.c" # 在當前工作目錄下查找所有以.c結尾的文件
$ find /dev -type b # 在/dev目錄下查找所有的塊設備文件
$ find . -size 5M # 在當前工作目錄下查找所有大小為5M的文件
$ find . -size +5M # 在當前工作目錄下查找所有大于5M的文件
$ find dir1 dir2 dir3 -empty # 在dir1,dir2,dir3目錄下查找所有空的文件和空的文件夾
$ find . -user he # 在當前工作目錄下查找he用戶擁有的文件
$ find . -gid 0 # 在當前工作目錄下查找root組(gid=0)擁有的文件
$ find . -perm 664 # 在當前工作目錄下查找權限為664(rw-rw-r--)的文件
$ find . -mtime 1 # 在當前工作目錄下查找在[1, 2)天前內容發生修改的文件 (find會省略小數部分)
$ find . -mtime +2 # 在當前工作目錄下查找在[3, )天前內容發生修改的文件
$ find /dev -type c -a -name "tty*" # 在/dev目錄下查找以tty開頭的字符設備文件
$ find /dev -type b -o -name "tty*" # 在/dev目錄下查找塊設備文件或者是以tty開頭的文件
$ find /dev -type c -a ! -name "tty*" # 在/dev目錄下查找不以tty開頭的字符設備文件
查看文件內容
cat
$ man catcat - concatenate files and print on the standard output
格式:cat [選項] [file]...
常見選項:-n, --number 對每一行進行編號
常見用法
$ cat /etc/passwd
$ cat -n /etc/passwd
$ sudo cat /etc/passwd /etc/shadow (已拼接的方式查看) 這里加sudo因為shadow存儲的為密碼,所以普通用戶不能查看
head
查看文件的前幾行
$ man headhead - output the first part of files
格式:head [選項] [file]...
常見選項:-n, --lines=[-]NUM 顯示前NUM行;若在NUM前面添加'-'號,則顯示除了后NUM行的所有行
常見用法
$ head text1 # 顯示text1的前10行
$ head text1 text2 text3 # 顯示text1,text2,text3的前10行
$ head -n 5 text1 # 顯示text1的前5行
$ head -n -5 text1 # 顯示除了最后5行的所有行
tail
查看文件的后幾行
$ man tailtail - output the last part of files
格式:tail [選項] [file]...
常見選項:-n, --lines=[+]NUM 顯示后NUM行;若在NUM前面添加'+'號,則從第NUM開始顯示-F 顯示后面追加的數據。一般用于查看日志文件。
-F 指令可以用于多窗口操作,查看不會關閉,如果在其他窗口,對文件進行改變,該命令會一直顯示文件變化情況。
常見用法
$ tail text1 # 顯示text1的后10行
$ tail text1 text2 text3 # 顯示text1,text2,text3的后10行
$ tail -n 5 text1 # 顯示text1的后5行
$ tail -n +5 text1 # 從第5行開始顯示
$ tail -F server.log # 顯示后10行,并且會顯示后面追加的數據
less(more)
$ man moremore - file perusal filter for crt viewing (說人話就是單頁瀏覽)
格式:more [選項] file...
提示:less是more的高級版本,若系統中沒有less命令,才會考慮使用more
常見用法
$ less text1 # 瀏覽text1
$ less text1 text2 # 瀏覽text1, text2
進入瀏覽界面后
f(forward) 往后翻一頁
b(backward) 往前翻一頁
:n(next) 查看下一個文件
:p(previous) 查看上一個文件
q(quit) 退出瀏覽界面
重定向
cat, head, tail等命令經常和重定向一起使用,比如:tail -n 20 text1 > a.txt。重定向的示意圖如下:
默認情況下,stdin(標準輸入)是與鍵盤相互綁定的,stdout stderr 與屏幕綁定。
在講重定向之前,我們需要引入文件描述符的概念(后面我們會詳細講解這個概念,現在我們只需要知道它是一個非負整數即可)。
一個 > 表示追加重定向 >> 就表示重定向 會將原來的內容進行覆蓋
常見用法
$ who > users
$ echo "liu yi fei" >> users
$ wc -l < users
$ cat users file1 > text # file1不存在
$ cat users file1 2> text # file1不存在
$ cat users file1 >& text # file1不存在
wc 命令 watch count 查看行數 兩條命令的區別
搜索文件內容
grep
grep(globally search for a regular expression)命令可以用于搜索文件內容,它的功能非常強大!grep 命令會按正則表達式去搜索文件,如果文件中某一行匹配指定的正則表達式,grep命令則會顯示這一行。
$ man grepgrep - print lines matching a pattern
格式:grep [選項] pattern [file]...
常見選項:-E, --extended-regexp 使用擴展的正則表達式-i, --ignore-case 忽略大小寫-v, --invert-match 顯示不匹配正則表達式的行-n, --line-number 顯示行號-c, --count 不顯示匹配的行,顯示匹配行的個數
常見用法
$ grep -nE "firmament" The_Holy_Bible.txt # 顯示The_Holy_Bible.txt中包含"firmament"的所有行,并顯示行號
$ grep -cvE "firmament" The_Holy_Bible.txt # 統計The_Holy_Bible.txt中不包含"firmament"的行數
正則表達式
正則表達式語法有點復雜,而且不同的工具使用的語法還不盡相同。下面我們介紹一些常用的正則表達式語法規則:
1. 基本單位基本單位主要包含:字符、轉義字符、.(匹配任意一個字符)、集合(比如,[abc],[^abc])、(expr)
2. 基本操作操作的對象是基本單位,主要包含兩個基本操作:連接和重復a. 連接:"ab", "[abc]x", ".txt", "\.txt"b. 重復+: 重復至少一次(>=1), 比如:"abc+", "[abc]+"?: 重復零次或一次(0|1), 比如:"abc?", "[abc]?"*: 重復任意次數(>=0), 比如:"abc*", "[abc]*", ".*"{m}: 重復m次{m,n}: 重復m到n次([m,n]){n, }: 至少重復n次([>=n])
3. 指定基本單位出現的位置^: 行首,比如:"^abc"$: 行尾,比如:"xyz$"\<: 詞首 默認以空白字符分割\>: 詞尾
(expr) expr 為正則表達式 ()表示一個單位
對 \ . txt 的理解 因為 .在正則表達式中為元字符 ,加\ 進行轉義后,變為 普通字符 .
Q: 以f開頭,以t結尾的單詞的正則表達式如何寫?(單詞之間以空格分隔)
\<f[^ ]*t\> #中間字符非空格重復任意次數
命令的組合
|(管道)
grep 命令之所以強大,主要在于它可以和其它命令組合使用。命令的組合主要有以下三種方式:
1. cmd1 ; cmd2先執行cmd1,再執行cmd2。如:mkdir dir; cd dir
2. cmd1 | cmd2 (管道)將上一個命令的輸出作為下一個命令的輸入。如:history | tail -n 20
3. cmd1 | xargs cmd2xargs(extended arguments) 可以將標準輸入里面的每一行轉換成命令的參數xargs往往和管道一起使用,如:cmd1 | xargs cmd2,它把cmd1輸出的每一行作為cmd2的參數find . -name "*.c" | xargs grep -nE "\<main\("
管道是進程之間進行通信的一種方式,是內存中的,由內核管理的數據結構。
xargs 是將管道搜索到的內容作為命令行參數 可以理解為上面 加一大堆的的.c 文件,如下面第一行所示。
改變文件權限
chmod
chmod 命令可以改變文件和目錄的權限。
目錄:本質就是一個文件。 這個文件的內容是一個一個目錄項(directory entry),在邏輯上,目錄項之間是用鏈表的方式鏈接起來的。
每個目錄項都是由一條單鏈表連接起來的。
權限對于普通文件和目錄文件而言,其含義是不太一樣的:
普通文件
r: 可讀
w: 可寫
x: 可執行 (可執行程序和腳本文件需要x權限才能直接運行)
目錄
r: 可讀 (ls)
w:可寫 (在目錄下添加和刪除文件)
x: 可執行 (cd,讀寫權限依賴于x權限,所以目錄一般都設置了x權限)
目錄本質上一個文件 文件里面的內容為一個個目錄項,邏輯上鏈表的形式銜接,讀可不可以查看,寫修改,x最基本 不能切換到該目錄項 如cd操作等
chmod 目錄的用法如下:
1. 文字設定法 (較少使用)chmod [ugoa][+=-][rwx] file/diru: userg: groupo: othera: all+: 添加權限-: 刪除權限=: 將權限設置為
2. 數字設定法 (常用)chmod mode file/dirmode: 三位八進制數字
常見用法
$ chmod o+w text1
$ chmod u=rwx,g=rx,o=r text1
$ chmod 664 text1
文件創建掩碼
umask
文件和目錄在創建的時候都有一個默認的權限,該權限是由文件創建掩碼 umask 決定的。
我們可以用 umask 命令查看當前的文件創建掩碼:
$ umask0002 # 當前的文件創建掩碼為2
創建文件 text 和目錄 dir,查看它們的權限:
$ ls -l
drwxrwxr-x 2 he he 4096 3月 12 20:55 dir/
-rw-rw-r-- 1 he he 0 3月 13 20:34 text
可見當 umask = 0002 時,目錄的默認權限為 775,文件的默認權限為 664
將文件創建掩碼 umask 設置為 0023
$ umask 0023
再創建文件 text1 和目錄 dir1,查看它們的權限
$ ls -l
drwxr-xr-- 2 he he 4096 3月 13 20:40 dir1
-rw-r--r-- 1 he he 0 3月 13 20:40 text1
可見當 umask = 0023 時,目錄的默認權限為 754,文件的默認權限為 644
那么文件創建掩碼是怎么進行工作的呢?
? 主要看umask后三位 后三位設置的想去掉的權限 工作原理不是相減,對umask進行按位取反,然后再按位與,文件按位與666(因為文件沒有執行權限,cd不進去),目錄按位與777(讀寫執行)
目錄:777 & (~umask)
文件:666 & (~umask)
鏈接
ln
我們可以用 ln 命令創建硬鏈接和符號連接(軟鏈接)。
Inode 磁盤上文件的唯一標識
創建硬鏈接
$ ln text1 h_link
$ ls -li268648 -rw-r--r-- 2 he he 0 3月 13 20:40 h_link268648 -rw-r--r-- 2 he he 0 3月 13 20:40 text1
? 可見 text1 和 h_link 是指向同一個文件的,并且硬鏈接數也由原來的 1 變成了 2。刪除 text1 或 h_link 只會減少硬鏈接數,當鏈接數為 0 的時候,才會真正刪除磁盤上的文件。(使用的是引用計數技術)
$ rm text1
$ ls -li268648 -rw-r--r-- 1 he he 0 3月 13 20:40 h_link # 硬鏈接數變為了 1
$ rm h_link
創建符號鏈接(軟鏈接)
$ ln -s text s_link
$ ls -li268648 lrwxrwxrwx 1 he he 4 3月 13 21:24 s_link -> text # s_link文件的內容為text,因此大小為4264859 -rw-rw-r-- 1 he he 0 3月 13 20:34 text
文件大小為4,存放的就是text4個字符,1111表示為軟硬鏈接的標識,建立一個硬鏈接就會變為2,就相當于連了幾根線在inode上。

可見 text 和 s_link 是指向不同文件的,text 的硬鏈接數不會發生改變。刪除 text 會導致符號鏈接 s_link 懸空:
$ rm text
$ ls -li268648 lrwxrwxrwx 1 he he 4 3月 13 21:24 s_link -> text # 顏色會發生改變
硬鏈接與軟鏈接的原理如圖
我們可以將符號鏈接和 Windows 系統上的快捷方式,或者 C 語言中的指針做類比。
對于大多數命令(rm除外),如果參數是符號鏈接,其實操作的是符號鏈接指向的文件(類似指針的解引用操作):
$ echo "I love xixi\n" > text
$ cat s_linkI love xixi
$ rm s_link # 刪除符號鏈接
遠程復制
scp
scp 命令可以用于上傳和下載文件
上傳:將本地的文件復制到遠程
下載:將遠程的文件復制到本地
scp 的用法和 cp 非常類似
$ man scpscp -- secure copy (remote file copy program)
格式:scp [選項] SRC... DEST本地路徑:可以用絕對路徑,也可以用相對路徑遠程路徑:用戶名@IP:路徑
常用選項:-r 遞歸復制整個目錄
常見用法
$ scp he@IP:~/text1 . # 將he用戶家目錄下的text1文件下載到當前工作目錄
$ scp ./file he@IP:~ # 將當前工作目錄下的file文件上傳到he用戶的家目錄下
打包壓縮
tar(text archive)
我們可以用 tar 命令打包和壓縮文件。tar 是一個非常有歷史的工具,這里我們只介紹它的傳統(經典)用法:
格式:
tar [主選項+輔選項] 包名 [文件或目錄]...
主選項(有且只能選擇其中一個):c: 創建r: 追加x: 釋放
輔選項:f: 指定包文件的名稱v: 顯示詳細信息z: 使用gzip算法壓縮或解壓縮包文件
常見用法
$ tar cvf package.tar text*
$ tar rvf package.tar The_Holy_Bible.txt
$ tar xvf package.tar
$ tar czvf package.tar.gz *
$ tar xzvf package.tar.gz
別名
alias
有些命令比較長,自然我們就想給這些命令起一個別名,方便以后使用,alias 命令就是用來做這事情的。
$ man alias
alias — define or display aliases
格式:
alias [命令=別名]...
常見用法
$ alias # 查看別名alias g++11='g++ -std=c++11'alias ll='ls -alF'alias ls='ls --color=auto'...
$ alias h='history' # 設置別名