很多東西, 如果太復雜, 太龐雜, 一開始, 可以只掌握最簡單的. 如果連最簡單的都不能掌握, 那看那么多有什么用?
關於cut, sed的 處理過程和思想?
vm: virtual machine, virtual memory: 虛擬機, 虛擬內存vm內存在windows中,叫做 pagefile.sys. 而在linux中叫做 swap.
vm虛擬內存是為了彌補真實內存設備/資源的不足而引入的. 為了防止"突然發生的" 交換頁, 可以把虛擬內存設置大一點.
sed的處理執行過程:
- 是依次先讀入行, 然后(如果有匹配模式表達式, 如果有編輯命令)則進行編輯命令處理, 然后將行中的內容
輸出. 如果沒有編輯命令, 即使有匹配模式表達式, 也會將沒有被匹配到的行輸出. (就是如果有匹配模式表
達式, 它只是對匹配到的這一行進行編輯命令處理, 而沒有匹配到的行, 只是說, 不進行后面指定的編輯命令
的處理而已, 但是它仍然要輸出)!
2. sed的s替換命令, old部分可以使用正則, 而new部分不可以使用正則.
3. sed的編輯命令 全都是 單字母命令, 如n就是其中的一個, 命令和命令之間要用分號隔開. 如果不分隔
,比如: sed 'np' foo
, 會提示: sed: -e expression #1, char2: extra characters after command
4. 如果是多個命令, 最好 是用大括號{}把命令序列括起來. 當然不括起來也可以.
5. sed 的格式: sed [option] '{命令序列}' [input-files]
6. sed 的默認操作是 "output" 輸出當前讀入的行. 你可以用sed '' foo
.來輸出所有的行; 但是如果你用p
命令, 會將當前模式空間中的行重復輸出, 結果得到兩個相同的行.
7.
關於保持空間
模式空間中的內容, 是一次讀入文件中的行, 當前行讀入/處理/輸出后, 讀入下一行時, 當前行的內容將在 模式空間被 覆蓋, 就像對變量的 再次 賦值一樣. 所以 模式空間中的內容, 只是暫時存在的, 不是永久的, 所以, 模式空間, 也叫做 臨時空間, 也叫做 暫存空間.
保持空間(hold space, 暫存區), 可以看作是倉庫, 而模式空間, 可以看作是 車間. 為什么需要保存空間? 因為, 模式空間中的內容不能長期保存, 由時候, 在后面的輸出中, 需要使用前面的某些行的內容, 這個時候, 就需要把前面的行的內容存儲起來, 這個存儲的地方就是這里的保持區. 保持區的操作有 : h, H, g, G , x
sed 的執行過程:
是 從文件中 依次讀入行, 然后進行(命令/參數)處理(包括p打印命令), 然后 再將當前 模式空間中的內容 輸出到屏幕上.
注意是先進行處理, 然后再輸出 . 也就是說, 默認的 sed命令是 輸出p. 或者這樣理解, 在 sed的命令 序列中, 總是有一個 "p"命令 默認在 命令序列的 "最后"! 除非你顯式的使用 選項 "-n" 來取消 命令序列的最后的'p'命令.
輕松寫正則表達式
任意數量的任意字符 .*
指定字符的任意數量: a, b ,*等等
一個或多個任意字符 .+
表示開頭/結尾位置 ^ $
存儲子匹配, 后向引用 () \1 指導 \99 ()是元字符, 表示分組, 要表示括號這個 普通含義 的字符, 需要使用 反寫杠來表示 轉義
**關於括號: 由於在替換時, 要替換的內容, 不能使用正則(反向引用除外), 所以 所有的括號, 包括大括號, 中小 括號都不用處理, 表示正常的括號. 而在 s命令的old部分, 要使用 正則表達式, 中的括號, 只有 中括號[ ] 可以不用加 反斜杠轉義, 而其他小括號和 大括號都要 加反斜杠才正確! **
注意非 ^ 選擇符的使用 這種寫法有時候會收到 意想不到的好效果!!!
它是從字符串內容的 開頭 開始檢查匹配, 一旦發現 不符合匹配的話, 馬上就終止檢查. 不會再往后往下檢查了, 馬上就跳出檢查了. 這個跟 什么貪婪匹配不同!
比如: 101, abc
要截取101, 就使用: sed 's/\([^,]*\).*/[\1]/' foo
管道和重定向的區別?
管道是把 前面的輸出 作為后面這個命令的輸入 作為輸入數據或內容進行處理, 后面跟的是 繼續處理的 命令.
而重定向是把 它們(輸出) 寫入到一個 文件中, 后面跟的 是 "文件名"
------ 所以更多的時候, 是用的 管道 --------
理解 sed的! 命令
! 你可以認為是"取反, 取否", 但是不完全准確.
他表示 "對當前匹配行" 不執行!后面的命令, 而"對當前匹配行以外的其他行" 執行! 后面的命令.
比如: sed '/inet addr/ !d' foo.txt
即為: 匹配inet addr行不刪除 , 而其他行都刪除. 就只剩下 inet addr 這一行了.
在正則表達式中, 像空格字符不需要轉義, 如果你分不清是否要 轉義, 可以先不加反斜杠, 如果不行, 再加上反斜杠. 嘗試一下就好了.
在sed命令中, 有多個命令, 如 a, c, i, r, q, w, hHgGx, s等多個命令, 其中最重要的命令當然還是 s.
a命令, i命令, 可以直接跟要插入的文本, 也可以為了區分和后面的內容, 加上反斜杠,
比如: sed 'aok' foo.txt
或者 sed 'iok '
就等於: sed 'a\ok' foo.txt
在這里, 特別要主要 i和a的用法, 他表示sed 要在 某一行的前面或 后面插入文本行. 這個還是非常有用的, 因為有現成的i或a命令, 所以, 就不用再考慮使用 s替換命令了. 然而 使用a或i命令的時候, 為了將命令字符a或i跟實際插入的內容相區別, 需要在a或i的后面加上\反斜杠. 但是在反斜杠后面就不能再加空格了, 否則空格會作為插入的字符內容一並記入其中. 除了在某一行的前面或后面插入文本行, 還可以在多行 范圍內, 在多行中的每一行 的前面或后面插入 文本行. `sed -i '5,8i\aaaa' ‵ 表示在5,8整個4行的每一行的前面都插入aaa. 其他同理, 參考: http://blog.csdn.net/zbszhangbosen/article/details/7434191
在 sed中, 在正則表達式中, 要刪除整行, 使用d命令, 如果不是刪除整行, 而是只是刪除/增加 一行中 部分的內容, 那就是用 替換. 替換中,只要替換的內容為空, 就是刪除!! 只要替換^就是增加!!!
空行的正則是: ^$, 如: sed 's/^$/d' foo.txt
在執行多個編輯命令的時候, 可以將多個命令分開, 這時候, 就已定要加 -e選項, 也可以將多個命令寫在一起, 用分號分割, 這時候可以不用加 -e選項.
sed 's/#.*//; 中間可以有多個空格 ; /^$/d' foo.txt
終結: 關於模式匹配的種類: 貪婪模式, 懶惰模式, 侵占模式?
- 模式匹配有 可能分為多個 子模式 匹配, 只有當所有子模式 匹配都 成功的時候, 才會認為整個 模式匹配成功, 比如: .foo就是 子模式p1(.)和子模式p2(foo)組成的
- 所謂的匹配的種類, 都是針對 "可變的"量詞 而言的, 包括: ?, *, +, {m, }, {m, n} 對於固定次數的量詞 {m}則是沒有這種說法的
- 貪婪模式是默認的匹配種類, 懶惰模式是在量詞的后面加上 問號, 如: ??, *?, +? {m,n}? 而侵占模式是是在量詞后面加上加號, 如: ?+, *+, {m, n}+
貪婪模式首先會匹配所有的字符, 看整體是否匹配, 如果不匹配, 則依次, 不斷的吐出 最后的字符來匹配其他的子模式...直到最后....
侵占模式, 是首先盡可能匹配所有的字符, 而且, 不會吐出字符, 也不管其他子模式是否匹配. ...
懶惰模式, 也叫勉強模式, 是盡量匹配盡可能少 的字符....
參考:
所以, 有時候, 用+ 號可能 匹配不成功, 而用* 則匹配成功! 特別是用 * 號時, 要理解 AB , 前面的字符本身就不存在, 其本身就是任意字符的匹配情況, 如AB 可以匹配到 ACCCCB 的情況, 這里A* 就是(做沒有A)的情況來匹配的, 實際匹配成功的只是因為B . 所以, 凡是AB 的情況, 可以不用管 A, A什么的, 只管 , 只看 后面的那個字符內容就可以了, 這里 只需要看B 就可以了!!!! 也就是, 不管B 前面是什么 都可以匹配到....
sed的處理執行過程:
-
是依次先讀入行, 然后(如果有匹配模式表達式, 如果有編輯命令)則進行編輯命令處理, 然后將行中的內容輸出. 如果沒有編輯命令, 即使有匹配模式表達式, 也會將沒有被匹配到的行輸出. (就是如果有匹配模式表達式, 它只是對匹配到的這一行進行編輯命令處理, 而沒有匹配到的行, 只是說, 不進行后面指定的編輯命令的處理而已, 但是它仍然要輸出)!
-
sed的s替換命令, old部分可以使用正則, 而new部分不可以使用正則.
-
sed的編輯命令 全都是 單字母命令, 如n就是其中的一個, 命令和命令之間要用分號隔開. 如果不分隔,比如:
sed 'np' foo
, 會提示:sed: -e expression #1, char2: extra characters after command
-
如果是多個命令, 最好 是用大括號{}把命令序列括起來. 當然不括起來也可以.
-
sed 的格式: sed [option] '{命令序列}' [input-files]
-
sed 的默認操作是 "output" 輸出當前讀入的行. 你可以用
sed '' foo
.來輸出所有的行; 但是如果你用p命令, 會將當前模式空間中的行重復輸出, 結果得到兩個相同的行.
掌握了sed命令后, 跟sed相似的awk命令也就很容易了. 他們的 命令格式和方法, 思想都差不多.
awk [options] 'commands' file-to-treated.
options 中 記住最常用的一個選項 -F 表示分割字段類型就好了.
commands的格式:
- 整個commands命令, 用單引號括起來, 而命令語句中的括號則必須用 雙引號才行.
- 所有的命令語句類似C 語言. 而且都要放在 大括號中
- 關於BEGIN END, 很簡單. 在awk中, BEGIN & END 都只執行一次. 他們不會對 "文件中按行處理 中的 行" 進行循環. 只有中間的代碼才會 對文件中的所有行進行 循環處理.
比如: awk -F: 'BEGIN{print "aaa bbb ccc"} {print "$1 \t $2 \t $3";} END{print "end end end"}' /etc/passwd | head -n 5
或者 | tail -n5 注意經過head 和tail的裁剪后, begin和end輸出的內容可以 被裁剪看不到了:
sed行的指定, 不但可以是數字, 還可以是正則表達式, Regexp總是以兩個斜線為范圍的
- 如果是范圍, 則正則表達式總是第一個被匹配的行, 如
sed '1, /^s/d' /etc/passwd
則表示第一行, 到第一個行首為s的行, 並不是所有的行, 要刪除所有以s開頭的行,應該是sed '/^s/d' /etc/passwd
- sed中的&, 表示前面找到的部分.在色調的替換命令中, 使用:
sed 's/[0-9]/&+num/g' ~/num
cat命令是打印嗎?
- cat命令並不是打印命令, 而是連接, 真正的打印命令是print, 也不是type, type是表示類型.
- cat是連接多個文件的,(通常是cat 1個文件, 所以就常常誤以為cat就是打印文件內容了, 實際上不是! ) 可以是多個輸入文件, 如:
cat file1 file2 file3
. 最重要的是, 還可以是stdin 標准輸入. 多行輸入內容用 <<EOF EOF - 但是標志開始和結束符號不一定必須使用eof, 可以是任意的字符串, 如: fo, foo, fooo, 等等
- 引導符號是 兩個<<, 相當於輸入重定向. 不是三個小於號.
- 要注意的是, cat默認的是輸出到stdout, 屏幕上, 如果要重定向到修改后的文件里面, 需要在cat后使用 ">>"符號, 中間可以留有空格???
- sed的執行過程, 是以循環讀取的每一行為單位, 先執行引號(通常是單引號)中的命令, 包括參數, 包括p命令,d命令等, 對模式空間的內容進行編輯處理, 然后再輸出 模式空間的內容.
對模式空間的內容進行編輯, 包括模式空間和暫存空間中的內容之間的交換處理等. 處理完成后, 總是輸出當前模式空間中的內容(除非你顯式地指定-n 就不會輸出.), 然后再掃描讀入下一行的內容到模式空間, 然后處理, 然后輸出, 然后不斷循環知道文件的結尾.
-
sed命令中的正則
有兩個, 一個是正則替換, 有三個斜杠,sed -i 's/some/other/g' filename
, 另一個是使用正則表達式來匹配 行. 表示匹配行, 只有兩個斜杠, 而且如果有起止范圍的話, 只會匹配第一個匹配成功的行.sed -i '1,/^some/ d ' filename
-
關於sed中的全局替換/g?
全局替換/g是一個標識, 它表示的是"在一行"內 . 因為sed的處理對象是 以 "行" 為單位的. /g是說, 在 "一行"內 , 如果有多個匹配的情況, 則全部替換, 否則如果沒有/g標識, 則默認的值替換第一個 匹配到的情況.
- 關於
sed '/ccc/{x;p;x;}' file
其中的 /ccc/ 表示的匹配ccc的這一行
x表示的是, 將模式空間的內容和暫存空間中的內容進行互換(模式空間和暫存空間實際上都是一段內存buffer而已), 這時候模式空間中的內容就是暫存空間中的內容了, 執行p命令,就輸出了暫存空間中的內容了, 然后再執行x, 再進行一次替換, 就把原來的模式空間中的內容替換回來了. 這個后面就不用p命令了, 因為執行完單引號中的命令后, 還有一個默認的輸出命令, 所以, 這時候, 模式空間中的內容就會被輸出.
因此, x;p;x 命令就是把當前暫存空間中的內容和當前行的內容 依次 輸出來.
miscellaneous雜項
sed的格式: sed [options] '{command/edit}' parameters.
sed在臨時緩沖區(模式空間) 對文件進行處理, 所以不會修改原文件, 除非顯式的指明-i選項. 前者相當於一個字符串拷貝, 后者則是一個字符串地址引用, 修改的就是這個字符串本身.
wc命令, 就是"word count", 單詞計數, 實際上還是很好用的, -l: --line, 統計行數, -w: --word 統計單詞個數. -c --char 統計字符數.
shell變量的類型:
- 系統預先定義的變量, 通常是大寫的, 如: PATH, USER, HOME, LANG(注意這里不是language).
- 用戶自己定義的變量(沒有用export關鍵字的), 叫本地local variables, 本地變量.
- 用戶自己定義的, 而且用export修飾的, 叫environment 環境變量, 可以在 subshell中使用的.
理解shell解釋器解釋命令的方式, 它是用空格做分隔符的. 所以在shell命令行中, 空格不是任意添加或不加的, 比如在變量賦值時, 等號兩邊不能有空格, 而用test或 其別名 "[" 判斷時則要添加空格!