對應課程https://www.bilibili.com/video/BV18p4y167Md
作業系統對應課程作業系統實戰45講
目錄CSAPP 深入理解電腦系統來自微軟大佬
yangminz
的公開課https://www.bilibili.com/video/BV17K4y1N7Q2(更新)
目錄C++ 物件導向程式設計系列來自侯捷大師的CPP物件導向程式設計系列(結束)
指令的基本用法與選項介紹。
man 是manual 的縮寫,將指令的具體資訊顯示出來。
當執行man date時,有DATE(1) 出現,其中的數字代表指令的類型,常用的數字及其類型如下:
代號 | 類型 |
---|---|
1 | 使用者在shell 環境中可以操作的指令或可執行文件 |
5 | 設定檔 |
8 | 系統管理員可以使用的管理指令 |
info 與man 類似,但是info 將文件分成一個個頁面,每個頁面可以進行跳躍。
/usr/share/doc 存放著軟體的一整套說明檔。
在關機前需要先使用who 命令查看有沒有其它用戶在線。
為了加快磁碟檔案的讀寫速度,位於記憶體中的檔案資料不會立即同步到磁碟上,因此關機之前需要先進行sync 同步操作。
# # shutdown [-krhc] 时间 [信息] |
-k : 不会关机,只是发送警告信息,通知所有在线的用户
-r : 将系统的服务停掉后就重新启动
-h : 将系统的服务停掉后就立即关机
-c : 取消已经在进行的 shutdown 指令内容
PATH 中宣告可執行檔的路徑,路徑之間以: 分隔。
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
sudo 允許一般使用者使用root 可執行的指令,不過只有在/etc/sudoers 設定檔中新增的使用者才能使用該指令。
RPM 和DPKG 為最常見的兩類軟體包管理工具:
Linux 發行版是Linux 核心及各種應用軟體的整合版本。 基於的套件管理工具商業發行版社群發行版RPM Red Hat Fedora / CentOS DPKG Ubuntu Debian
命令 | 作用 |
---|---|
:w | 寫入磁碟 |
:w! | 當檔案為唯讀時,強制寫入磁碟。到底能不能寫入,與使用者對該文件的權限有關 |
:q | 離開 |
:q! | 強制離開不保存 |
:wq | 寫入磁碟後離開 |
:wq! | 強制寫入磁碟後離開 |
GNU 計劃,譯為革奴計劃,它的目標是創建一套完全自由的作業系統,稱為GNU,其內容軟體完全以GPL 方式發布。其中GPL 全稱為GNU 通用公共授權協議,包含了以下內容: 以任何目的運行此程序的自由; 再複製的自由; 改進此程序,並公開發布改進的自由。 ¶ 開源協定 Choose an open source license (opens new window) 如何選擇開源授權許可證? (opens new window)
IDE(ATA)全名為Advanced Technology Attachment,介面速度最大為133MB/s,因為並口線的抗干擾性太差,且排線佔用空間較大,不利電腦內部散熱,已逐漸被SATA 所取代。
SATA 全稱為Serial ATA,也就是使用串列埠的ATA 接口,抗干擾性強,且對資料線的長度要求比ATA 低很多,支援熱插拔等功能。 SATA-II 的介面速度為300MiB/s,而新的SATA-III 標準可達到600MiB/s 的傳輸速度。 SATA 的數據線也比ATA 的細很多,有利於機殼內的空氣流通,整理線材也比較方便。
SCSI 全名為Small Computer System Interface(小型機系統介面),經歷多代的發展,從早期的SCSI-II 到目前的Ultra320 SCSI 以及Fiber-Channel(光纖通道),介面型式也多種多樣。 SCSI 硬碟廣為工作站級個人電腦以及伺服器所使用,因此會使用較為先進的技術,如碟片轉速15000rpm 的高轉速,且傳輸時CPU 佔用率較低,但是單價也比相同容量的ATA 及SATA 硬碟更加昂貴。
Linux 中每個硬體都被當作一個文件,包括磁碟。磁碟以磁碟介面類型進行命名,常見磁碟的檔案名稱如下:
其中檔案名稱後面的序號的決定與系統偵測到磁碟的順序有關,而與磁碟所插入的插槽位置無關。
磁碟分割表主要有兩種格式,一種是限制較多的MBR 分割區表,一種是較新且限制較少的GPT 分割區表。
MBR 中,第一個磁區最重要,裡面有主要開機記錄(Master boot record, MBR)及分割表(partition table),其中主要開機記錄佔446 bytes,分割表佔64 bytes。
分割表只有64 bytes,最多只能儲存4 個分割區,這4 個分割區為主分割區(Primary)和擴充分割區(Extended)。其中擴展分區只有一個,它使用其它扇區以記錄額外的分區表,因此透過擴展分區可以分出更多分區,這些分區稱為邏輯分區。
Linux 也把分割區當成文件,分割區文件的命名方式為: 磁碟檔名+ 編號,例如/dev/sda1。注意,邏輯分割區的編號從5 開始。
不同的磁碟有不同的磁區大小,例如512 bytes 和最新磁碟的4 k。 GPT 為了相容於所有磁碟,在定義磁區上使用邏輯區塊位址(Logical Block Address, LBA),LBA 預設大小為512 bytes。
GPT 第1 個區塊記錄了主要開機記錄(MBR),緊接著是33 個區塊記錄分區信息,並把最後的33 個區塊用於對分區信息進行備份。這33 個區塊第一個為GPT 表頭紀錄,這個部分紀錄了分區表本身的位置與大小和備份分區的位置,同時放置了分區表的校驗碼(CRC32),操作系統可以根據這個校驗碼來判斷GPT 是否正確。若有錯誤,可以使用備份分割區進行還原。
GPT 沒有擴展分區概念,都是主分區,每個LAB 可以分4 個分區,因此總共可以分4 * 32 = 128 個分區。
MBR 不支援2.2 TB 以上的硬碟,GPT 則最多支援到233 TB = 8 ZB。
BIOS(Basic Input/Output System,基本輸入輸出系統),它是一個韌體(嵌入在硬體中的軟體),BIOS 程式存放在斷電後內容不會遺失的唯讀記憶體中。
BIOS 是開機的時候電腦執行的第一個程序,這個程序知道可以開機的磁碟,並讀取磁碟第一個磁區的主要開機記錄(MBR),由主要開機記錄(MBR)執行其中的開機管理程序,這個開機管理程序會載入作業系統的核心檔案。
主要開機記錄(MBR)中的開機管理程序提供以下功能:
選單、載入核心檔案、轉交其它開機管理程式。轉交這個功能可以用來實現了多重引導,只需要將另一個作業系統的開機管理程式安裝在其它分區的啟動磁區上,在啟動開機管理程式時,就可以透過選單選擇啟動目前的作業系統或者轉交給其它開機管理程式從而啟動另一個作業系統。
下圖中,第一區的主要開機記錄(MBR)中的開機管理程式提供了兩個選單: M1、M2,M1 指向了Windows 作業系統,而M2 指向其它分割區的啟動磁區,裡麵包含了另外一個開機管理程序,提供了一個指向Linux 的選單。
安裝多重引導,最好先安裝Windows 再安裝Linux。因為安裝Windows 時會覆寫主要開機記錄(MBR),而Linux 可以選擇將開機管理程式安裝在主要開機記錄(MBR)或其它分割區的啟動區,並且可以設定開機管理程式的選單。
BIOS 不可以讀取GPT 分割區表,而UEFI 可以。
對分割區進行格式化是為了在分割區上建立檔案系統。一個分割區通常只能格式化為一個檔案系統,但是磁碟陣列等技術可以將一個分割區格式化為多個檔案系統。
最主要的幾個組成部分如下:
除此之外還包括:
指一個文件內容所在的block 過於分散。
在Ext2 檔案系統中所支援的block 大小有1K,2K 及4K 三種,不同的大小限制了單一檔案和檔案系統的最大大小。
大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大單一文件 | 16GB | 256GB | 2TB |
最大檔案系統2TB 8TB 16TB 一個block 只能被一個檔案使用,未使用的部分直接浪費了。因此如果需要儲存大量的小文件,那麼最好選用比較小的block。
inode 具體包含以下資訊:
inode 有以下特點:
inode 中記錄了文件內容所在的block 編號,但每個block 都非常小,一個大檔案隨便都需要幾十萬的block。而一個inode 大小有限,無法直接引用這麼多block 編號。因此引入了間接、雙間接、三間接引用。間接引用是指,讓inode 記錄的引用block 區塊記錄引用資訊。
建立一個目錄時,會指派一個inode 與至少一個block。 block 記錄的內容是目錄下所有檔案的inode 編號以及檔案名稱。 可以看出檔案的inode 本身不記錄檔案名,檔案名稱記錄在目錄中,因此新增檔案、刪除檔案、更改檔案名稱這些操作與目錄的w 權限有關。
如果突然斷電,那麼檔案系統會發生錯誤,例如斷電前只修改了block bitmap,而還沒有將資料真正寫入block 中。 ext3/ext4 檔案系統引入了日誌功能,可以利用日誌來修復檔案系統。
掛載利用目錄作為檔案系統的進入點,也就是說,進入目錄之後就可以讀取檔案系統的資料。
為了讓不同Linux 發行版本的目錄結構保持一致性,Filesystem Hierarchy Standard (FHS) 規定了Linux 的目錄結構。
最基礎的三個目錄如下:
使用者分為三種: 檔案擁有者、群組以及其它人,對不同的使用者有不同的檔案權限。
使用ls 查看一個檔案時,會顯示一個檔案的訊息,例如drwxr-xr-x. 3 root root 17 May 6 00:14 .config
,對這個訊息的解釋如下:
常見的文件類型及其意義有:
9 位元的檔案權限欄位中,每3 個為一組,共3 組,每一組分別代表對檔案擁有者、所屬群組以及其它人的檔案權限。一組權限中的3 位元分別為r、w、x 權限,表示可讀、可寫入、可執行。
文件時間有以下三種:
列出文件或目錄的信息,目錄的資訊就是其中包含的文件。
# # ls [-aAdfFhilnrRSt] file|dir
-a : 列出全部的文件
-d : 仅列出目录本身
-l : 以长数据串行列出,包含文件的属性与权限等等数据
cd [相对路径或绝对路径]
# # mkdir [-mp] 目录名称
-m : 配置目录权限
-p : 递归创建目录
rmdir [-p] 目录名称
-p : 递归删除目录
# # touch [-acdmt] filename
-a : 更新 atime
-c : 更新 ctime,若该文件不存在则不建立新文件
-m : 更新 mtime
-d : 后面可以接更新日期而不使用当前日期,也可以使用 --date= "日期或时间"
-t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]
複製文件。 如果來源檔案有兩個以上,則目的檔案一定要是目錄才行。
cp [-adfilprsu] source destination
-a : 相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明
-d : 若来源文件为链接文件,则复制链接文件属性而非文件本身
-i : 若目标文件已经存在时,在覆盖前会先询问
-p : 连同文件的属性一起复制过去
-r : 递归持续复制
-u : destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
--preserve=all : 除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了
# # rm [-fir] 文件或目录
-r : 递归删除
移動文件。
# # mv [-fiu] source destination
# # mv [options] source1 source2 source3 .... directory
-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
可以將一組權限用數字來表示,此時一組權限的3 個位當做二進制數字的位,從左到右每個位的權值為4、2、1,即每個權限對應的數字權值為r : 4、w : 2、x : 1。
# # chmod [-R] xyz dirname/filename
範例: 將.bashrc 檔案的權限修改為-rwxr-xr--。
# # chmod 754 .bashrc
也可以使用符號來設定權限。
# # chmod [ugoa] [+-=] [rwx] dirname/filename
- u: 拥有者
- g: 所属群组
- o: 其他人
- a: 所有人
- +: 添加权限
- -: 移除权限
- =: 设定权限
範例: 為.bashrc 檔案的所有使用者新增寫入權限。
# # chmod a+w .bashrc
**檔案名稱不是儲存在一個檔案的內容中,而是儲存在一個檔案所在的目錄中。 **因此,擁有檔案的w 權限並不能對檔案名稱進行修改。 目錄儲存檔案列表,一個目錄的權限也就是對其檔案列表的權限。
**因此,目錄的r 權限表示可以讀取文件列表;w 權限表示可以修改文件列表,具體來說,就是添加刪除文件,對文件名進行修改;x 權限可以讓該目錄成為工作目錄,x 權限是r 和w 權限的基礎,如果無法使目錄成為工作目錄,也就沒辦法讀取檔案清單以及對檔案清單進行修改了。 **
# # ln [-sf] source_filename dist_filename
-s : 默认是 hard link,加 -s 为 symbolic link
-f : 如果目标文件存在时,先删除目标文件
在目錄下建立一個條目,記錄著檔案名稱與inode 編號,這個inode 就是原始檔的inode。 刪除任一個條目,檔案還是存在,只要引用數量不為0。 有以下限制: 不能跨越檔案系統、不能連結目錄。
# # ln /etc/crontab .
# # ll -i /etc/crontab crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
符號連結檔案保存著原始檔案所在的絕對路徑,在讀取時會定位到來源檔案上,可以理解為Windows 的捷徑。 當來源檔案被刪除了,連結檔案就打不開了。 可以為目錄建立連結。
# # ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 - > /etc/crontab
# # cat [-AbEnTv] filename
-n : 打印出行号,连同空白行也会有行号,-b 不会
# # head [-n number] filename
-n : 后面接数字,代表显示几行的意思
指令搜尋。
# # which [-a] command
-a : 将所有指令列出,而不是只列第一个
文件搜尋。速度比較快,因為它只搜尋幾個特定的目錄。 ## whereis [-bmsu] dirname/filename
文件搜尋。可以用關鍵字或正規表示式進行搜尋。 locate 使用/var/lib/mlocate/ 這個資料庫來進行搜索,它儲存在記憶體中,每天更新一次,所以無法用locate 搜尋新建的檔案。可以使用updatedb 來立即更新資料庫。
# # locate [-ir] keyword
-r: 正则表达式
文件搜尋。可以使用檔案的屬性和權限進行搜尋。
# # find [basedir] [option]
example: find . -name " shadow* "
(一)與時間有關的選項
-mtime n : 列出在 n 天前的那一天修改过内容的文件
-mtime +n : 列出在 n 天之前 (不含 n 天本身) 修改过内容的文件
-mtime -n : 列出在 n 天之内 (含 n 天本身) 修改过内容的文件
-newer file : 列出比 file 更新的文件
(二)與文件擁有者及所屬群組有關的選項
-uid n
-gid n
-user name
-group name
-nouser : 搜索拥有者不存在 /etc/passwd 的文件
-nogroup: 搜索所属群组不存在于 /etc/group 的文件
(三)與檔案權限及名稱有關的選項
-name filename
-size [+-]SIZE: 搜寻比 SIZE 还要大 (+) 或小 (-) 的文件。这个 SIZE 的规格有: c: 代表 byte,k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是 -size +50k
-type TYPE
-perm mode : 搜索权限等于 mode 的文件
-perm -mode : 搜索权限包含 mode 的文件
-perm /mode : 搜索权限包含任一 mode 的文件
Linux 底下有很多壓縮檔名,常見的如下:
擴充名 | 壓縮程式 |
---|---|
*.Z | compress |
*.zip | zip |
*.gz | gzip |
*.bz2 | bzip2 |
*.xz | xz |
*.tar | tar 程式打包的數據,沒有經過壓縮 |
*.tar.gz | tar 程式打包的文件,經過gzip 的壓縮 |
*.tar.bz2 | tar 程式打包的文件,經過bzip2 的壓縮 |
*.tar.xz | tar 程式打包的文件,經過xz 的壓縮 |
gzip 是Linux 使用最廣的壓縮指令,可以解開compress、zip 與gzip 所壓縮的檔案。
經過gzip 壓縮過,原始檔就不存在了。 有9 個不同的壓縮等級可以使用。 可以使用zcat、zmore、zless 來讀取壓縮檔案的內容。
$ gzip [-cdtv#] filename
-c : 将压缩的数据输出到屏幕上
-d : 解压缩
-t : 检验压缩文件是否出错
-v : 显示压缩比等信息
-# # : ## 为数字的意思,代表压缩等级,数字越大压缩比越高,默认为 6
提供比gzip 更高的壓縮比。 查看指令: bzcat、bzmore、bzless、bzgrep。
$ bzip2 [-cdkzv#] filename
-k : 保留源文件
提供比bzip2 更佳的壓縮比。 可以看到,gzip、bzip2、xz 的壓縮比不斷優化。不過要注意的是,壓縮比越高,壓縮的時間也越長。
查看指令: xzcat、xzmore、xzless、xzgrep。
$ xz [-dtlkc#] filename
壓縮指令只能對一個檔案進行壓縮,而打包能夠將多個檔案打包成一個大檔案。 tar 不僅可以用於打包,也可以使用gip、bzip2、xz 將打包檔案進行壓縮。
$ tar [-z | -j | -J] [cv] [-f 新建的 tar 文件] filename... ==打包压缩
$ tar [-z | -j | -J] [tv] [-f 已有的 tar 文件] ==查看
$ tar [-z | -j | -J] [xv] [-f 已有的 tar 文件] [-C 目录] ==解压缩
-z : 使用 zip;
-j : 使用 bzip2;
-J : 使用 xz;
-c : 新建打包文件;
-t : 查看打包文件里面有哪些文件;
-x : 解打包或解压缩的功能;
-v : 在压缩/解压缩的过程中,显示正在处理的文件名;
-f : filename: 要处理的文件;
-C 目录 : 在特定目录解压缩。
使用方式 | 命令 |
---|---|
打包壓縮 | tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱 |
查看 | tar -jtv -f filename.tar.bz2 |
解壓縮 | tar -jxv -f filename.tar.bz2 -C 要解壓縮的目錄 |
可以透過Shell 請求核心提供服務,Bash 正是Shell 的一種。
命令歷史: 記錄使用過的命令命令與檔案補全: 快捷鍵: tab 命名別名: 例如lm 是ls -al 的別名shell scripts 通配符: 例如ls -l /usr/bin/X* 列出/usr/bin下面所有以X 開頭的文件
$
,也可以用${}
的形式;$ x=abc
$ echo $x
$ echo ${x}
變數內容如果有空格,必須使用雙引號或單引號。
x="lang is $LANG"
,則x 的值為lang is zh_TW.UTF-8;x='lang is $LANG'
,則x 的值為lang is $LANG
。 指令
或$(指令)
的方式將指令的執行結果賦值給變數。例如version=$(uname -r),則version 的值為4.15.0-22-generic。 可以使用export 指令將自訂變數轉成環境變量,環境變數可以在子程式中使用,所謂子程式就是由目前Bash 而產生的子Bash。 Bash 的變數可以宣告為陣列和整數數字。注意數字類型沒有浮點數。如果不進行聲明,預設是字串類型。變數的宣告使用declare 指令: $ declare [-aixr] variable
-a : 定义为数组类型
-i : 定义为整数类型
-x : 定义为环境变量
-r : 定义为 readonly 类型
使用[ ] 來對數組進行索引操作:
$ array[1]=a
$ array[2]=b
$ echo ${array[1]}
$PATH
變數指定的搜尋路徑的順序找到第一個指令來執行。重定向指的是使用檔案取代標準輸入、標準輸出和標準錯誤輸出。
1 | 程式碼 | 運算符 |
---|---|---|
標準輸入(stdin) | 0 | < 或<< |
標準輸出(stdout) | 1 | > 或>> |
標準誤差輸出(stderr) | 2 | 2> 或2>> |
其中,有一個箭頭的表示以覆蓋的方式重定向,而有兩個箭頭的表示以追加的方式重定向。
可以將不需要的標準輸出以及標準錯誤輸出重定向到/dev/null,相當於丟進垃圾箱。 如果需要將標準輸出以及標準錯誤輸出同時重定向到一個文件,則需要將某個輸出轉換為另一個輸出,例如2>&1 表示將標準錯誤輸出轉換為標準輸出。
$ find /home -name .bashrc > list 2>&1
$ nohup latte-dock --replace > /dev/null 2>&1 & # 没有任何输出的后台任务
管線是將一個指令的標準輸出作為另一個指令的標準輸入,在資料需要經過多個步驟的處理之後才能得到我們想要的內容時就可以使用管線。
在指令之間使用| 分隔各個管線指令。
$ ls -al /etc | less
cut 將資料切分,取出想要的部分。 切分過程一行一行地進行。
$ cut
-d : 分隔符
-f : 经过 -d 分隔后,使用 -f n 取出第 n 个区间
-c : 以字符为单位取出区间
$ last
root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in
root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33)
root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16)
$ last | cut -d ' ' -f 1
$ export
declare -x HISTCONTROL= " ignoredups "
declare -x HISTSIZE= " 1000 "
declare -x HOME= " /home/dmtsai "
declare -x HOSTNAME= " study.centos.vbird "
.....(其他省略).....
$ export | cut -c 12-
用於排序。
$ sort [-fbMnrtuk] [file or stdin]
-f : 忽略大小写
-b : 忽略最前面的空格
-M : 以月份的名字来排序,例如 JAN,DEC
-n : 使用数字
-r : 反向排序
-u : 相当于 unique,重复的内容只出现一次
-t : 分隔符,默认为 tab
-k : 指定排序的区间
$ cat /etc/passwd | sort -t ' : ' -k 3
root:x:0:0:root:/root:/bin/bash
dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
alex:x:1001:1002::/home/alex:/bin/bash
arod:x:1002:1003::/home/arod:/bin/bash
可以將重複的資料只取一個。
$ uniq [-ic]
-i : 忽略大小写
-c : 进行计数
$ last | cut -d ' ' -f 1 | sort | uniq -c
1
6 (unknown
47 dmtsai
4 reboot
7 root
1 wtmp
輸出重定向會將輸出內容重定向到檔案中,而tee 不僅能夠完成這個功能,還能保留螢幕上的輸出。也就是說,使用tee 指令,一個輸出會同時傳送到檔案和螢幕上。
$ tee [-a] file
用來刪除一行中的字符,或對字符進行替換。
$ tr [-ds] SET1 ...
-d : 删除行中 SET1 这个字符串
$ last | tr ' [a-z] ' ' [A-Z] '
將tab 字元轉為空格字元。
$ col [-xb]
-x : 将 tab 键转换成对等的空格键
將tab 轉換一定數量的空格,預設為8 個。
$ expand [-t] file
-t : tab 转为空格的数量
將有相同數據的那一行合併在一起。
$ join [-ti12] file1 file2
-t : 分隔符,默认为空格
-i : 忽略大小写的差异
-1 : 第一个文件所用的比较字段
-2 : 第二个文件所用的比较字段
直接將兩行貼在一起。
$ paste [-d] file1 file2
-d : 分隔符,默认为 tab
split 將一個文件分成多個文件。
$ split [-bl] file PREFIX
-b : 以大小来进行分区,可加单位,例如 b, k, m 等
-l : 以行数来进行分区。
- PREFIX : 分区文件的前导名称
g/re/p(globally search a regular expression and print),使用正規表示式進行全域查找並列印。
$ grep [-acinv] [--color = auto] 搜寻字符串 filename
-c : 统计个数
-i : 忽略大小写
-n : 输出行号
-v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行
--color=auto : 找到的关键字加颜色显示
$ grep -n ' the ' regular_express.txt
8:I can ' t finish the test.
12:the symbol ' * ' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world Happy is the same with "glad".
18:google is the best tools for search keyword
因為{ 和} 在shell 是有特殊意義的,因此必須使用轉義字元進行轉義。
$ grep -n ' go{2,5}g ' regular_express.txt
用於格式化輸出。 它不屬於管道指令,在傳送資料給printf 時需要使用$( ) 形式。
$ printf ' %10s %5i %5i %5i %8.2f n ' $( cat printf.txt )
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
是由Alfred Aho,Peter Weinberger, 和Brian Kernighan 創造,awk 這個名字就是這三個創始人名字的首字母。
awk 每次處理一行,處理的最小單位是字段,每個字段的命名方