標籤:bash基礎及配置 標準i/o 管道 shell編程基礎
1、Bash基礎及配置
站在使用者的角度來講,SHELL的類型:
登入式shell
正常通過某終端登入
su - USERNAME
su -l USERNAME
非登入式shell
su USERNAME
圖形終端下開啟的虛擬終端
自動執行的shell指令碼
bash的設定檔:
全域配置:
/etc/profile, /etc/profile.d/*.sh , /etc/bashrc
個人配置:
~/.bash_profile, ~/.bashrc
profile類的檔案
1、設定環境變數
2、運行命令或指令碼
bashrc類的檔案
1、定義本地變數
2、定義命令別名
登入式shell如何讀取設定檔:
/etc/profile ----> /etc/profile.d/*.sh ----> ~/.bash_profile ----> /etc/bashrc
非登入式shell如何讀取設定檔:
~/.bashrc ---> /etc/bashrc ----> /etc/profile.d/*.sh
完全切換 su - USERNAME 或 su -l USERNAME
半切換:su USERNAME
作用範圍越小,越是最終生效的。
如何配置一個永久的別名命令?個人的?全域的?
如何配置一個永久的全域提示?個人的?全域的?
2、管道及IO重新導向
運算器、控制器 ----> CPU
儲存空間:RAM
輸入裝置/輸出裝置
程式:指令+資料
控制器:指令
運算器:
儲存空間:
地址匯流排:記憶體定址
資料匯流排:資料轉送
控制匯流排:控制指令
實際上,是一根匯流排,三種功能
寄存器:CPU暫時儲存空間
I/O:硬碟,
程式:
INPUT裝置:
OUTPUT裝置:
系統設定:
預設輸出裝置:標準輸出,STDOUT,1
預設輸入裝置:標準輸入,STDIN,0
預設錯誤輸出:標準錯誤,STDERR,2
標準輸入裝置:鍵盤
標準輸出和錯誤輸出:顯示器(廉價)
I/O重新導向:
Linux
輸出重新導向(大於符號):> 覆蓋輸出
>> 追加輸出
set -C 禁止對已經存在檔案使用覆蓋重新導向
若要強制覆蓋輸出:則使用>|
set +C 關閉上述功能
2> 重新導向錯誤輸出
2>>追加方式
&> :重新導向標準輸出或錯誤輸出至同一個檔案,覆蓋方式
輸入重新導向(小於符號):<
<< Here Document 在此處產生文檔 結束符:END,EOF
管道:把前一個命令的輸出,作為後一個命令的輸入
命令1 | 命令2 | 命令3 | ....
練習:
1、統計/usr/bin/目錄下的檔案個數;
ls /usr/bin/ | wc -l
2、取出當前系統上所有使用者的shell,要求,每種shell只顯示一次,並且按順序進行顯示;
cut -d : -f 7 /etc/passwd | sort -u
3、思考:如何顯示/var/log目錄下每個檔案的內容類型?
4、取出/etc/inittab檔案的第6行;
5、取出/etc/passwd檔案中倒數第9個使用者的使用者名稱和shell,顯示到螢幕上並將其儲存至/tmp/users檔案中;
cut -d : -f 1,7 /etc/passwd |head -9 |tail -1 | tee /tmp/users
6、顯示/etc目錄下所有以pa開頭的檔案,並統計其個數;
7、不使用文字編輯器,將alias cls=clear一行內容添加至目前使用者的.bashrc檔案中;
Regex:
文本尋找的需要:
grep、egrep、fgrep
grep:根據模式,搜尋文本,並將符合模式文本行顯示到螢幕上來
Pattern:由文本字元和Regex的元字元組合而成的匹配條件
grep [options] PATTERN [FILE...]
-i(忽略字元大小寫)
--color [匹配到的字元顯示顏色]
-v 顯示沒有被模式比對到的行
-o 只顯示被模式比對到的字串
*:任意長度的任一字元
?:任意單個字元
[]:
[^]
Regex:Regular EXPression,REGEXP
元字元:
.:匹配任意單個字元
[]:匹配指定範圍內的單個字元
[^]:匹配指定範圍外的單個字元
字元集合:[:digit:],[:lower:],[:upper:],[:punct:],[:space:],[:alpha:],[:alnum:]
匹配次數:(貪婪模式,儘可能長的去匹配)
*:匹配其前面的字元任意次
a, b, ab, aab, acb ,adb,amnb
a*b(表示任意次a,跟上b):ab,aab
a.*b只要以a開頭,以b結尾即可
a\?b:
.*:表示任意長度的任一字元
\?:匹配其前面的字元一次或0次
\{m,n\}:匹配其前面的字元至少m次,至多n次
\{1,\}:至少一次
\{0,3\}:最多3次
位置錨定:
^:錨定行首:此字元後面的任意內容必須出現在行首
$:錨定行尾:此字元後面的任意內容必須出現在行尾
^$:空白行;
錨定詞首 \<或者\b:其後面的任一字元必須作為單詞的首部出現 eg:root\b或root\<
錨定詞尾 \>或者\b:其前面的任一字元必須作為單詞的尾部出現 eg:\broot或\>root
單詞:只要是以字母開始,字母結束,中間不出現特殊字元即可;r55t
分組:
\(\)
\(ab\)*
後向引用
\1:引用第一個左括弧以及與之對應的右括弧所包括的所有內容
\2:
\3:
練習:
1、顯示/proc/meminfo檔案中以不區分大小的s開頭的行;
grep -i ‘^s‘ /proc/meminfo
grep ‘^[sS]‘ /proc/meminfo
2、顯示/etc/passwd中以nologin結尾的行;
grep ‘nologin$‘ /etc/passwd
取出預設shell為/sbin/nologin的使用者列表
grep "nologin$‘ /etc/passwd | cut -d: -f1
取出預設shell為bash,且其使用者ID號最小的使用者的使用者名稱
grep ‘bash$‘ /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1
3、顯示/etc/inittab中以#開頭,且後面跟一個或多個空白字元,而後又跟了任意非空白字元的行;
grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab
4、顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行;
grep ‘:[0-9]:‘ /etc/inittab
5、顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行;
grep ‘^[[:space:]]\{1,\}‘ /boot/grub/grub.conf
6、顯示/etc/inittab檔案中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;
grep ‘^\([0-9]\).*\1$‘ /etc/inittab
練習:
1、找出某檔案中的,1位元,或2位元;
grep ‘[0-9]\{1,2\}‘ /proc/cpuinfo
grep --color ‘\<[0-9]\{1,2\}\>‘ /proc/cpuinfo
2、找出ifconfig命令結果中的1-255之間的整數;
3、尋找當前系統上名字為student(必須出現在行首)的使用者的帳號的相關資訊, 檔案為/etc/passwd
grep ‘^student\>‘ /etc/passwd | cut -d: -f3
id -u student
student1
student2
練習:分析/etc/inittab檔案中如下文本中前兩行的特徵(每一行中出現在數字必須相同),請寫出可以精確找到類似兩行的模式:
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep ‘^l\([0-9]\):\1.*\1$‘ /etc/inittab
4、Bash基礎及配置、標準I/O、管道及shell編程基礎;