1. 程式人生 > >第八章shell基礎下

第八章shell基礎下

com unp rtt eid www. timestamp lfw basename 修改

8.10 shell特殊符號cut命令

8.11 sort_wc_uniq命令

8.12 tee_tr_split命令

8.13 shell特殊符號下

8.14擴展

8.15 課堂筆記

8.10 shell特殊符號cut命令

特殊符號 \ #脫義字符,將特殊字符或通配符還原成一般字符 [root@localhost ~]# a=1 [root@localhost ~]# b=2 [root@localhost ~]# echo $a 1 [root@localhost ~]# echo $b 2 [root@localhost ~]# c=$a$b [root@localhost ~]# echo $a$b
12 [root@localhost ~]# echo ‘$a$b‘ $a$b [root@localhost ~]# echo \$a\$b $a$b | #將管道符前面內容的輸出結果讓後面命令執行 [root@localhost ~]# cat 1.txt |wc -l 1 幾個跟管道符有關的命令 註意###cat、head、sort、uniq、grep不會對文件內容進行更改#### cut分割,-d 分隔符 -f 指定段號(例: 1; 1,2; 1-3) -c 指定第幾個字符(如果使用-c時,不能同時使用-d,-f) 例:cat /etc/passwd |head -2 |cut -d ":" -f 1-3
# |head -2 表示截取etc/passwd開頭前兩段內容 [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1-3 root:x:0 bin:x:1 [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1,2 root:x bin:x [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1-3 -c 1 cut: 只能指定列表中的一種類型 Try ‘cut --help‘ for more information. [root@localhost ~]# cat /etc/passwd |head -2 |cut -c 1
r b

8.11 sort_wc_uniq命令

#sort默認按照ASCII排序 #sort之前要先source 文件,防止裏面有一些命令對文件趙成影響(例如裏面有rm命令,會刪除) 1、sort排序, -n 以數字排序(字母會認為是0,排在最前面)(默認從小到大) [root@localhost ~]# sort -n 3.txt > ; ahsflhg;a 1.txt 2.txt 1234 2345 2345 24324234 -r 反序 (從大到小) [root@localhost ~]# sort -n -r 3.txt 24324234 2345 2345 1234 2.txt 1.txt ahsflhg;a ; > -t分隔符 -k(按照第幾列進行排序) [root@localhost ~]# cat 2.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@localhost ~]# sort -t ":" -k 1 2.txt adm:x:3:4:adm:/var/adm:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin root:x:0:0:root:/root:/bin/bash 2、wc -l 統計行數 -m 統計字符數 -w 統計詞 [root@localhost ~]# wc -l 2.txt 5 2.txt [root@localhost ~]# wc -m 2.txt 183 2.txt 3、uniq 去重, -c 統計行數 技術分享圖片

8.12 tee_tr_split命令

1、tee和>類似,重定向的同時還在屏幕顯示 例: sort 2.txt |uniq -c |tee 1.txt #排序2.txt的結果進行去重uniq,然後結果tee到1.txt,會顯示到屏幕上 [root@localhost ~]# sort 2.txt |uniq -c |tee 1.txt 3 123 1 123214 2 234 2 444 1 555 1 6543 2、tr 替換字符,tr ‘a‘ ‘b‘,大小寫替換tr‘[a-z]‘ ‘[A-Z]‘ [root@localhost ~]# cat 2.txt |tr ‘2‘ ‘a‘ 1a3a14 1a3 1a3 a34 a34 555 444 6543 444 1a3 3、split 切割,-b 大小(默認單位字節 ),-l 行數 #對大文件進行切割,均分為指定大小或者行數的小文件 例: 技術分享圖片 [root@localhost xin]# split -l 500 2.txt [root@localhost xin]# ll 總用量 28 -rw-r--r--. 1 root root 8525 8月 17 21:45 2.txt -rw-r--r--. 1 root root 2618 8月 17 21:50 xaa -rw-r--r--. 1 root root 2055 8月 17 21:50 xab -rw-r--r--. 1 root root 2056 8月 17 21:50 xac -rw-r--r--. 1 root root 1796 8月 17 21:50 xad 切割後文件命名可以自定義,在文件後面加上自定義命名即可 split -l 500 2.txt abc [root@localhost xin]# split -l 500 2.txt abc [root@localhost xin]# ll 總用量 28 -rw-r--r--. 1 root root 8525 8月 17 21:45 2.txt -rw-r--r--. 1 root root 2618 8月 17 21:52 abcaa -rw-r--r--. 1 root root 2055 8月 17 21:52 abcab -rw-r--r--. 1 root root 2056 8月 17 21:52 abcac -rw-r--r--. 1 root root 1796 8月 17 21:52 abcad

8.13 shell特殊符號下

$變量前綴,!$組合,正則裏面表示行尾 ~用戶家目錄,正則表達式表示匹配符 ;多條命令寫到一行,用分號分割 [root@localhost ~]# ls 1.txt; wc -l 3.txt 1.txt 16 3.txt &放到命令後面,會把命令丟到後臺運行 [root@localhost ~]# sleep 100 & [1] 1471 [root@localhost ~]# jobs [1]+ 運行中 sleep 100 & [ ]指定字符中的一個,[0-9],[a-zA-Z],[abc] [root@localhost ~]# ls [1-9].txt 1.txt 3.txt [root@localhost ~]# ls [a-z].txt a.txt b.txt c.txt || 和&&,用於命令之間 ll是表示或者,第一條命令執行成功,第二條命令便不執行;若第一條命令執行失敗,第二條命令便會執行 [root@localhost ~]# ls 1.txt || ls 5.txt 1.txt [root@localhost ~]# ls 5.txt || wc -l 1.txt ls: 無法訪問5.txt: 沒有那個文件或目錄 6 1.txt &&表示且,只有第一條命令執行成功才會執行第二條命令 [root@localhost ~]# ls 1.txt && ls 5.txt 1.txt ls: 無法訪問5.txt: 沒有那個文件或目錄 [root@localhost ~]# ls 5.txt && wc -l 1.txt ls: 無法訪問5.txt: 沒有那個文件或目錄

8.14擴展

1、關於PROMPT_COMMAND環境變量的含義 技術分享圖片http://www.linuxnote.org/prompt_command-environment-variables.html 2、source exec 區別 技術分享圖片http://alsww.blog.51cto.com/2001924/1113112 3、Linux特殊符號大全技術分享圖片http://ask.apelearn.com/question/7720 4、sort並未按ASCII排序 技術分享圖片http://blog.csdn.net/zenghui08/article/details/7938975

8.15課堂筆記

一、grep (#重點) egrep是grep的升級版,即grep -E == egrep,當你需要過濾時含有特殊符號,要用egrep才能成功過濾 -v #加-v表示取反 例: grep "[a-zA-Z]" 1.txt #將1.txt內有字母的行都過濾出來 grep -v "[a-zA-Z]" 1.txt #將1.txt內除字母外其他行過濾出來 [root@localhost ~]# cat 1.txt a 3 12aaa3 s 1 123aq214 d 2 23q4 f 2 4a44 1 5a55 1 65 [root@localhost ~]# grep "[a-zA-Z]" 1.txt a 3 12aaa3 s 1 123aq214 d 2 23q4 f 2 4a44 1 5a55 [root@localhost ~]# grep -v "[a-zA-Z]" 1.txt 1 65 egrep "^$ |^#" 1.txt #將1.txt的空行(^$)、註釋行(^#)過濾出來 egrep -v "^$ |^#" 1.txt #將1.txt的除非空行、非註釋行外其他行過濾出來 [root@localhost ~]# egrep "^$|^#" 1.txt #### ## ### ##3 [root@localhost ~]# egrep -v "^$|^#" 1.txt 3 123 1 123214 2 234 2 444 1 555 1 65 33 3#3 333###4### 二、shell變量 ps" _ "下劃線是特殊字符,如果要加入變量名,輸出只會將下劃線後面接著的變量顯示出來;下劃線前面的變量會顯示不出來 例:for i in `seq 1 10`;do echo "lv_$i";done #通過for循環echo顯示lv級別, [root@localhost ~]# for i in `seq 1 10`;do echo "lv_$i";done lv_1 lv_2 lv_3 lv_4 lv_5 lv_6 lv_7 lv_8 lv_9 lv_10 將lv定義為變量lvname的值,然後執行命令顯示不出來 [root@localhost ~]# lvname=lv;for i in `seq 1 10`;do echo "$lvname_$i";done 1 2 3 4 5 6 7 8 9 10 將"_"下劃線換成"-"橫杠,變量lvname就能顯示出來 [root@localhost ~]# lvname=lv;for i in `seq 1 10`;do echo "$lvname-$i";done lv-1 lv-2 lv-3 lv-4 lv-5 lv-6 lv-7 lv-8 lv-9 lv-10 三、source 命令 source 環境變量配置文件 # 修改環境變量配置文件後,必須註銷重新登錄才能生效,使用source 命令可以不用重新登錄 技術分享圖片 [root@localhost ~]# vim admin [root@localhost ~]# source admin [root@localhost ~]# echo $name2 lisi 四、環境變量配置文件設置 PS1=[\u@\h \W]$ (面試中可能會問到,平時不用掌握) PS1的常用參數以及含義: \d :代表日期,格式為weekday month date,例如:"Mon Aug 1" \H :完整的主機名稱 \h :僅取主機名中的第一個名字 \t :顯示時間為24小時格式,如:HH:MM:SS \T :顯示時間為12小時格式 \A :顯示時間為24小時格式:HH:MM \u :當前用戶的賬號名稱 \v :BASH的版本信息 \w :完整的工作目錄名稱 \W :利用basename取得工作目錄名稱,只顯示最後一個目錄名 \# :下達的第幾個命令 \$ :提示字符,如果是root用戶,提示符為 # ,普通用戶則為 $ 五、特殊字符 "\" 表示脫義字符,將特殊字符的語意去掉 [root@localhost ~]# grep "[" 1.txt #"["中括號為特殊字符,雙引號識別不了,所以報錯 grep: 無效的常規表達式 [root@localhost ~]# grep "\[" 1.txt #用\號脫義,就可以成功 [1234] [124 #"*"號查找前面的字符出現0次或者0次以上,所以就算該行沒有出現"[",也會顯示出來 [root@localhost ~]# grep "\[*" 1.txt 12412jkahksflg123 214asd asf 234dsa asd24345 [1234] 2344] [124 #"+"號表示前面字符至少出現一次才會過濾出來,這裏+是特殊字符,所以用到egrep [root@localhost ~]# egrep "\[+" 1.txt [1234] [124 六、與管道符相關的命令 1、cut分割 -d分隔符 -f 段號 -c 段中第幾個字符 例:cut -d ":" /etc/passwd -f 1,3 #文件要放在中間 2、sort -n(以數字排序(默認大到小)) -r(反序) -k(按照第幾列的值排序) 例:sort -t " " -k 2 1.txt #將1.txt的內容以空格為分隔符,按照第二列的值從小到大排序 3、wc -l (統計行數) -m(統計字符數) -w(統計單詞) -c(統計字節數) 4、uniq -c(統計出現行數5、tr 替換字符 #只能針對字符串,不能單獨使用 例: echo "xiaogao" | tr "x" "X" 6、split 切割 -b 大小(默認單位字節) -l (行數) #將文件以指定的大小或者以指定行數切割均分文件 例: split -b 六、|| (或者) &&(且) || (或者 ) :如果第一條命令執行正確,第二條命令則不執行。如果第一條命令執行錯誤,則執行第二條命令。 &&(且) :如果第一條命令執行成功了才執行第二條命令,如果第一條命令錯誤,第二條命令則不執行。 ps: 1、| 與 || 的區別 |和||的區別同理,都可以作為邏輯或運算符; |還可以作為按位或的運算符,運算規則與按位與同理; ||同樣有類似短路的功能,即第一個條件若為true,則不計算後面的表達式。 2、&與&&的區別 &和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。 &&還具有短路的功能,即如果第一個表達式為false,則不再計算第二個表達式。 &還可以用作按位與的運算符,兩個表達式的值按二進制位展開,對應的位(bit)按值進行“與”運算,結果保留在該位上 (1)短路功能測試: public class AndTest { public static void main(String[] args) { String str=null; if (str!=null&str.equals("")) { System.out.println("true"); } } } 當為&,會報錯 java.lang.NullPointerException,即空指針錯誤; 當為&&,則不會報錯 (2)按位與: 運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:兩位同時為“1”,結果才為“1”,否則為0 例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 ;因此,3&5的值得1。 public class AndTest { public static void main(String[] args) { int a=3&5; System.out.println("a="+a); } } 結果a=1.

第八章shell基礎下