1.linux系統中的三種I/O裝置所代表的編号分别是:标準輸⼊(STDIN),⽂件描述符為0,預設從鍵盤擷取輸⼊;标準輸出(STDOUT),⽂件描述符為1,預設輸出到顯⽰屏;标準錯誤(STDERR),⽂件描述符為2,預設輸出到顯⽰屏。I/O重定向就是為了改變預設輸入、輸出的位置: >:表示标準輸出覆寫重定向;>>:表示标準輸出追加重定向;内部機制是按回車才開始發生重定向;
2>:表示錯誤輸出覆寫重定向;2>>:表示錯誤輸出追加重定向;
&>:表示合并标準輸出和錯誤輸出覆寫重定向,老的版本不支援,老版本支援2>&1(标準錯誤也當成标準輸出);
&>>:表示合并标準輸出和錯誤輸出追加重定向;
可以把&了解成也;例如:下列的哪項輸出結果不同:
cat /etc/issue /etc/xxx > /data/all.log 2>&1,
cat /etc/issue /etc/xxx 2> /data/all.log 1>&2,
cat /etc/issue /etc/xxx 2>&1 > /data/all.log,這個不同,到2&1這步時,會在螢幕上輸出标準錯誤,而把标準輸出輸入到檔案裡,加個小括号執行結果就一樣了,如下
(cat /etc/issue /etc/xxx 2>&1 ) > /data/all.log,
cat /etc/issue /etc/xxx &> /data/all.log,
<:輸入重定向;cat>這叫單行重定向,還可以多行,
<<:多行輸入;“<<終止詞”指令從鍵盤把多行重導向給STDIN,直到 終止詞 位置的所有文本都發送給STDIN,應用場景:可以寫配置檔案,用<<開始,一般行首用EOF(end of file),其實其它包括數字也可以,隻要和結尾一樣就行,要注意的是不管前面或後邊都不能有空格,有的話認為沒結束,有時被稱為就地文本(here documents),
【注意:cat < a.txt > b.txt相當于a複制到b,相當于把檔案清零;cat < a.txt >> b.txt 相當于不斷追加a.txt的内容,檔案會自己膨脹,直至塞滿硬碟。】
其它應用例如:
mail -s "Please Call" [email protected] <
hello!missli
nice to meet you!
Please give me a call when you get in.
to do some maintenance on server1.
Details when you're on-site
jk
EOF(前後都不能有空格)
小括号():合并多個程式的STDOUT,例如( cal 2007 ;cal 2008 ) > all.txt
set -C指令:禁止覆寫重定向;>|:強制覆寫重定向(與set -C相反);
set +C指令:解除禁止覆寫重定向的設定;
基礎指令
把标準錯誤輸出定向到文本,螢幕上就不輸出标準錯誤資訊;
也可以把标準錯誤輸出定向到1文本,标準輸出定向到文本2;例如:
管道符(|)作用是把前一個指令的執行結果當做後一個指令的輸入;w | tee b.log;可以重定向到文本又可以在終端上顯示;加-a選項可以追加到文本,不覆寫,即w | tee -a(append附加) b.log;例如:w | tree -a b.log | tr 'a-z' 'A-Z'即在文本中儲存w指令結果,在螢幕顯示同時,完成大小寫轉換;
管道中 - 符号
例如:
将 /home 裡面的檔案打包,但打包的資料不是記錄到檔案,而是傳送到 stdout,經過管道後,将 tar -cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取前一個指令的 stdout, 是以,就不需要使用臨時file了,tar -cvf - /home | tar -xvf - 。
2.tr 轉換和删除字元,或壓縮空格,tr -s ' '就可以把空格壓縮掉,單引号中間鍵入空格,第二字元集不寫;
tr [OPTION] 第一字元集 [第二字元集],如:tr 1234 xyz會把123456中的1234替換成xyzz,多餘的會以z替換,這時要用 -t選項,沒有的就不替換了;
-c –C --complement:取相反的,例如tr -dc '123',除了123都删,連回車已删除,這時隻能用ctrl+d鍵;
-d --delete:删除所有屬于第一字元集的字元,tr -d ' n ' seq.log把豎列換成橫列
-s --squeeze-repeats:把連續重複的字元以單獨一個字元表示,但不連續的保留,即壓縮,可以壓縮空格,如tr -s “”(中間空格) < a.out 或者壓縮替換成加号ts -s " 此處鍵入空格" + < a.out
-t --truncate-set1:将第一個字元集對應字元轉化為第二字元集對應的字元,
[:alnum:]:字母和數字;[:alpha:]:字母;
[:cntrl:]:控制(非列印)字元;
[:digit:]:數字 ;[:graph:]:圖形字元;
[:lower:]:小寫字母;[:print:]:可列印字元; [:upper:]:大寫字母;
[:punct:]:标點符号; [:space:]:空白字元;
[:xdigit:]:十六進制字元;
3.cat [OPTION]... [FILEname]...
-E:顯示行結束符$;隻是顯示回車換行,其它不見;
-n:對顯示出的每一行進行編号,包括空行;
-A:顯示所有控制符,可以見到所有的,看腳本可以用來排錯;
-b:非空行顯示編号,空行不顯示編号,配合-s使用
-s:壓縮連續的空行成一行,空行也顯示;是壓縮相鄰的空行;
nl filename也可以加行号,類似cat -n;tac filename顯示的是和cat顯示的相反;rev 1.txt是行裡反着顯示
4.seq:預設從1開始,-s支援分隔符,例如基礎指令
5.head預設顯示前十行,包括空行;格式:head [OPTION]... [FILEnamei]...,可以跟多個檔案
-n(number),顯示test.txt檔案的前幾行,或者直接 -;-後跟要取第幾行的數字;
-c指定取前幾個位元組,2個位元組就是一個a字母;
-v顯示檔案名,一般配合-n;
6.tail顯示檔案尾部,預設後10行;tail [OPTION]... [FILEname]...
-n # 指定擷取後#行,n可以省略;
-c # 指定擷取後#位元組
-v顯示檔案名
-f 跟蹤顯示檔案fd新追加的内容,常用日志監控,有新内容就顯示;删除檔案就不顯示;
相當于 --follow=descriptor
-F 跟蹤檔案名,相當于--follow=name --retry,根據檔案名跟蹤,删除檔案,建立相同的檔案名就又跟蹤;
當tail運作時有程序,是以ll /proc/pidof tail(反引号)/fd,可見檔案描述符号;
tailf類似tail -f,隻不過當檔案不增長時不通路,相對來說節約資源,對系統IO影響比較小;
7.sort:就是用來排序的,不改變原始檔案。sort讀取每一行輸入,并按照指定的分隔符(預設為空格)将每一行劃分成多個字段,這些字段就是排序的對象。同時,sort可以指定何種排序規則進行排序,預設使用目前字元集即ascii碼排序規則,這時排序如果末尾有空行會排序出空行在第一位;因為sort預設的排序方式是升序,這時如果搭配head -n使用要注意,取的行數裡面包括空行;還可以按照字典排序規則、數值排序規則、按照月份排序規則、按照檔案大小排序規則,格式:sort [options] filename
-r以降序排列,注意:這個選項并不參與排序,而是操作排序完成後的結果;-R随機排序;
-n(number)以數值大小,從大到小來排序,因為sort預設是按照數值的位排序;
-t c:使用c做為字段界定符;例如-t:是以:作為分隔符,
-k X 選項按照使用c字元分隔的X列來排,-t指定分隔符是什麼,-k指定第幾列;
-u 選項(獨特,unique)删除輸出中的重複行;
-f 忽略(fold)字元串中的字元大小寫,
8.uniq指令:從輸入中删除前後相接的重複的行;格式:uniq [option]... filename
-c: 顯示每行重複出現的次數;
-d: 僅顯示出現重複的行;
-u: 僅顯示沒有重複的行;
注:連續且完全相同方為重複;
常和sort 指令一起配合使用:sort a.txt | uniq -c;例如列出兩個不同檔案夾下重複的檔案:
[root@centos7 ~]#ls /root > /tmp/root.log
[root@centos7 ~]#ls /data > /tmp/data.log
[root@centos7 data]#grep -f /tmp/data.log /tmp/root.log,-f 滿足其中的一個就顯示,
f1_2.log
f1.log
[root@centos7 ~]#sort /tmp/data.log /tmp/root.log | uniq -d
[root@centos7 ~]#ls /root /data -1|sort |uniq -d
[root@centos7 ~]#( ls /root ;ls /data ) | sort |uniq -d
取出兩個不同目錄中不同的檔案清單
[root@centos7 data]#grep -vf /tmp/data.log /tmp/root.log ;-v取反,-f根據模式檔案取;
anaconda-ks.cfg
Desktop
[root@centos7 ~]#sort /tmp/data.log /tmp/root.log | uniq -u
[root@centos7 ~]#( ls /root ;ls /data ) | sort |uniq -u
9.cut按列檢視文本,格式:cut option filename
-d(delimiter):指明分隔符,預設時tab鍵;-f:是取第幾列,可以1,也可以1,3,6也可以1-6還可以混合使用,1-3,7這麼表示;-c是按字元數來取,可以導出文本用vim看,前提是對齊的;
--output-delimiter=符号:可以在輸出是指定什麼分隔符;
如:cat /etc/passwd | cut -d: -f1,3 --output-delimiter=+即用加号顯示結果基礎指令;
若是用字元取分區使用率,可以df>df.log,用vim df.log;看右下角是第幾行的第幾個字元,然後再取df | cut -c34-36就可以取出需要的列,前提是對齊的文本,當然也可以:
例如取ip位址的一種方式:
paste 合并兩個檔案的同行号的列到一行;
paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,預設用TAB
-s : 所有行合成一行顯示;例如:
基礎指令;
11.wc統計文本時,顯示的第一個是行數,第二個是單詞數(按空格計),第三個是位元組數(一個字母算一個位元組);-l 隻計數行數;-w 隻計單詞總數;-c 隻計位元組總數;-m 隻計字元總數;對于英文字母來說,一個位元組就是一個字元,因為1個ascii碼對應一個位元組;但中文不同,1個漢字即1個字元對應3個位元組;
-L 顯示檔案中最長行的長度;ls -1|wc -L可查出字元數最多的檔案名;注意ls檢視時檔案都顯示成一行,但實際上它是一個檔案一行,ls輸入到文本中可檢視,ls -1可成列顯示,再wc -L可統計出;
12.比較兩個檔案之間的差別:2c2表示第二行;3a4表示第三行到第四行;
基礎指令;
加-u選項可以找出不同之處儲存以備還原;
基礎指令;假設rm -rf f2.log;
注意:還原的f2.log檔案名變成f1.log,原來的f1.log變成f1.log.orig字尾的檔案;
13.grep:文本過濾(模式:pattern)工具;根據使用者指定的“模式”對目标文本逐行進行比對檢查;列印比對到的行
模式:由正規表達式字元及文本字元所編寫的過濾條件;
文法:grep [options] 模式 [filename];最簡單的文法是單純的字元串;例如:grep root /etc/passwd;例如取ens33的ip所在行:ifconfig ens33 | grep netmask ;或者ifconfig ens33 | grep ask;
-i忽略大小寫 grep -i root /etc/passwd;-v不包含,取反,如grep -v root /etc/passwd不包含root的行;-m比對幾次,如3次:grep -v root -m 3 /etc/passwd意思是取前三個不包括root的行; -n顯示比對的行号;-c統計出比對的行數,例如統計1-100之間多少個帶9的數字,seq 100 | grep -c 9,19個,出現多少次9則是seq 100 | grep -o 9| wc -l,20,因為最後99出現2次;-o隻顯示比對的字元串本身,例如grep -o root /etc/passwd,隻顯示比對到的root,如果和c搭配,-oc,是按行統計的root,而不是多少個,因為一行中多少個它不統計,這時就要搭配wc -l 指令;
-A # after, 後#行;包含關鍵字的後#行,包含關鍵字那行的後幾行,
-B # before, 前#行;關鍵字的前幾行;例如:grep -B 1 up nmap.log,包含關鍵字起始的那行的前1行;
-C # context, 前後各#行;grep -nC3 root /etc/passwd即包含root關鍵字的前後三行,含本行;
-e代表OR,關鍵字1或者關鍵字2的行,例如grep -e root -e nologin /etc/passwd;并且的就過濾2次:
gerp root /etc/passwd | grep nologin
-w比對單詞;數字,字母,下劃線都算單詞;-hello-前後的符号算單詞的分界線;
-f file 根據模式檔案處理,滿足檔案裡的一個就顯示,類似-e;
--color=auto: 對比對到的文本着色顯示;
-q 靜默模式,不輸出任何資訊,隻關心找到找不到,找到echo $?=0;找不到echo $?=1;
注意:/misc神奇的檔案夾,cd/misc;cd cd/自動挂載CD光牒到/misc/cd檔案夾,centos7下啟用systemctl start autofs
才可以進/misc;
14.正規表達式:REGEXP: Regular Expressions,由一類特殊字元及文本字元所編寫的模式,其中有些字元(元字元)不表示字元字面意義,而表示控制或通配的功能;程式支援:grep,sed,awk,vim, less,nginx,varnish等
分兩類:基本正規表達式:BRE;擴充正規表達式:ERE,grep -E,即egrep;
正規表達式引擎:采用不同算法,檢查處理正規表達式的軟體子產品;
元字元分類:字元比對、比對次數、位置錨定、分組;
字元比對:
. 比對任意單個字元,注意:點. 比對除 "n" (Linux中n表示回車+換行,回車(ACSII:13 或0x0d),換行(ACSII:10 或0x0a))之外的任何單個字元。例如:ls /data | grep ...表示包含3個字元,不是就三個字元,ls /date | grep '../.log' 就可以過濾出檔案名是.log字尾的檔案名;
[] 比對指定範圍内的任意單個字元,示例:[jk] [0-9] [a-z] [a-zA-Z];
[^] 比對指定範圍外的任意單個字元,不包括中括号内的;
[:alnum:] 字母和數字;
[:alpha:] 代表任何英文大小寫字元,亦即 A-Z, a-z;
[:lower:] 小寫字母 [:upper:] 大寫字母;
[:blank:] 空白字元(空格和制表符);
[:space:] 水準和垂直的空白字元(比[:blank:]包含的範圍廣);
[:cntrl:] 不可列印的控制字元(倒退、删除、警鈴...);
[:digit:] 十進制數字 [:xdigit:]十六進制數字;
[:graph:] 可列印的非空白字元;
[:print:] 可列印字元;
[:punct:] 标點符号;
比對次數:用在要指定次數的字元後面,用于指定前面的字元要出現的次數。星号:比對星号前,不同于通配符中的星号,通配符中表示任意長度的任意次數,這裡是星号前的字元的任意次,包括0次;例如a**通配符中表示a後面跟什麼都可以,而在正規表達式中:表示a前面什麼也沒有也行,即使空也算,不是指空行,例如b符合條件,因為b表示空,沒a,後面是a,aa,aaa,不管多少次隻能是a,a是重複的和空; 寫的時候加上雙引号,以防止誤認為是通配符;
備注:當問号緊跟在任何一個其他限制符 如星号,+, ?, {n}, {n,}, {n,m}後面時,比對模式是非貪婪的。非貪婪模式盡可能短的比對所搜尋的字元串,而預設的貪婪模式則盡可能長的比對所搜尋的字元串。
點星号 .* 任意長度的任意字元,相當于通配符的星号;
? 比對其前面的字元0或1次
+ 比對其前面的字元至少1次
{n} 比對前面的字元n次
{m,n} 比對前面的字元至少m次,至多n次
{,n} 比對前面的字元至多n次
{n,} 比對前面的字元至少n次
位置錨定:
^:比對行首;
$:比對行尾;
<,b:比對詞首;
>,b:比對詞尾。
分組:
():生成分組模式;
後向應用:1,2,...