shell環境設定
shell也是一個應用程式,工作在使用者模式,運作表現為一個程序,通過pstree可以檢視到bash程序。
shell 程序用于通過指令行界面,類似windows的explore資料總管。
bourn:開發shell ,bsh-->sh
BSD:研發csh
korn:研發ksh(商業版,功能強大)。
bash-->bourn again shell,Bash-->開源,bsh的增強版
shell本身是解釋器,能夠了解其他指令,并且讓指令執行起來。了解語句,更具流程控制機制讓語句按需要執行。
讀一句執行一句。
編譯器:了解源程式,并且能夠将源程式轉換成二進制代碼後執行。
先将這個源程式轉換成二進制格式再執行。
編譯器:gcc
解釋器:bash python、perl
在編寫解釋型程式的時候,由于需要解釋器進行逐條解釋,所有在程式的開頭要寫明解釋器程式的位置。比如:”#!/bin/bash“
變量:記憶體空間的外在表現,是記憶體空間名稱,用于存儲資料。
變量類型:資料存儲格式,資料表示範圍:
整型:
浮點型:
字元型:
布爾型:
字元:ascii,所有基本字元一共128個,至少需要7bits來表示所有的基本字元。
浮點:單精度,雙精度
使用變量的步驟(c、java):
1、聲明:給定一個變量類型。
2、聲明的同時給其一個初始值,這個過程叫初始化。
3、指派: int v=2
shell中的 變量
屬于弱類型語言:
1、不強制區分變量類型,無論存儲什麼資料,均預設是字元格式存儲。
2、不需要事先聲明。直接使用,直接指派。
定義變量
[set] var_name=value 有空格加“”
引用變量:
${var_name} 通常‘{}’可以省略。{}通常用于對變量所定義數值的擴充
比如: curname=gong
echo “i am $curname”
echo "she is ${curname}ziyan"
撤銷變量:
unset var_name
bash變量類型:
本地變量:隻對目前shell程序有效,登出後無效。
局部變量:對小範圍代碼段有效。其作用範圍不包括目前shell的所有位置。
設定方法:local var_name=value
環境變量:對目前shell及子shell有效(可以通過指令“bash”進入子shell)。
設定方法:export var_name=value
位置變量:$1/$2.........
特殊變量:$$、$!、$?.........
bash變量也可以聲明,并指定類型:declare
declare -i var_name:聲明一個整型變量。
declare -x var_name:聲明一個環境變量。
declare -a var_name:聲明一個數組。
bash中如何檢視環境變量:
printenv、export
檢視所有變量:set
變量的引用:${var_name}
變量替換:隻能在雙引号中實作。
bash的引号:
雙引号:可以實作變量的替換。
單引号:不替換,并且顯示字元串本身。
比較:name= 'good dog'
echo this is“$name”
echo this is ‘$name’
反引号:指令引用,引用反引号指令的執行結果。
BingGongtekiMacBook-Pro:~ binggong$ echo "this is `date +%T`"
this is 14:36:47
$( )應用執行結果
BingGongtekiMacBook-Pro:~ binggong$ echo "nihao $(date)"
nihao 2016年10月20日 星期四 14時27分52秒 CST
bash 指令行快捷方式:
ctrl+u:删除指令行首至目前光标所在位置的内容。
ctrl+k:删除目前光标到行尾的内容。
ctrl+a:跳至行首部
ctrl+e:跳至行尾部
ctrl+l:清屏,相當于clear
ctrl+c:終止程式
ctrl+z:将目前指令送至背景執行。
語言控制結構:
1、順序執行
2、選擇執行
3、循環執行
當alias的定義别名與元指令名相同的時候,使用元指令時可以在指令前加\來表示。
檔案名通配符
?:用于比對一個任意字元
*:用來比對檔案名中的任意字元串,比對長度可以是0-n個
[]:比對[]内的任意一個字元
-可以表示一個範圍[a-z]
[acdf]表示任意一個字元
[!abdf]不比對括号内adbf的任意字元
多條指令中的邏輯運算符合括号
command1 || command2:邏輯或運算,command1執行成功就不執行command2,否則會執行command2,兩者選其一。
command1 && command2:邏輯與運作,command1執行成功才執行command2指令。
(command1;command2):優先執行()内部的指令,并按順序執行
{command1;command2}:調用子shell指令并執行{}内部的指令,其實質是函數。
正規表達式:指令輸出或者文本内容篩選查找。
使用位置:grep、awk、sed、vim
grep:支援基本的正規表達式,隻針對檔案進行查找工作
egrep:支援擴充正規表達式
tgrep:不支援正常表達式元字元,搜尋字元串速度快。
正規表達式是一類字元所書寫的模式。
元字元:不表示字元本身的意義,而用于額外功能的描述。通常元字元有兩類,一類比對具體的字元,一類比對位置,比如行首行尾。
^:瞄定行首的符合條件的字元表達式。 grep --color=auto ^ssh /etc/passwd
$:錨定行尾的符合條件的内容,用法“name$”
^$:空白行
.:比對任意單個字元。
*:比對緊挨在其前面的字元任意次數。
[]:配置指定範圍内的任意單個字元。
[^]:比對任意指定範圍外的單個字元。
[:lower:]:小寫
[:upper:]:大寫
[:digit:]:數字
[:space;]:空白字元
\?:比對緊挨在其前面的字元0-1次。
x\{m,n\}:比對其前面的字元至少m次,最多n次。
x\{0,n\}:至多n次
x\{m,\}:至少m次
x\{m\}:精确比對隻有m次。
\<:錨定詞首,用于定位單詞。也可以用\b 比如:\<word
\>:錨定詞尾,用于定位單詞,表示單詞的結尾是指定的内容比如: \>word
\<word\>:完全錨定某一個單詞。
\(\):分組,将括号内的當成一個内容使用。當要求後面的内容和前面分組的内容相同時,可以使用\1來表示,1表示第幾個分組。
用法:\(parttern\) 例如:grep '\(s.x\).*\1 /etc/passwd
例如:grep '^s\{1,2\}.*' /etc/passwd
grep “[bB].\{2,6\}[tT]”/etc/passwd
grep "[^]"
組合使用正規表達式
grep的選項:
--color=auto 通過修改全局(環境)變量來改變顔色:export GREP_COLOR='01;33'
-v:反向查找,隻輸出比對内容以外的行。
-n:在結果輸出的同時,輸出行号
-i:不區分大小寫。
-o:隻顯示比對的字元串,而不是整個行。
-A n:顯示比對到的行時,順帶顯示器前面的n行
-B n 後面的n行
-C n:前後的n行。
-E:表示擴充正規表達式,可以使用“|”或方式查找,但不支援與方式,是以需要管道重定向來分開查找。
grep -E 'gongbing|liuhaixiang' student.txt
-l:從多個檔案中查找,隻輸出比對内容的檔案名稱。
grep -l "root" /etc/*
-h:從多個檔案中查找,隻輸出比對的内容,不顯示檔案名稱。
grep -h "root" /etc/*
練習:
顯示/etc/rc.d/rc.sysinitd中以#開頭,并且後面跟一個或多個空白字元,而後又跟了任意非空白字元。
grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/rc.d/rc.sysinit
1、顯示/proc/cpuinfo中的processor開頭并且後面跟了一個空字元的行,而後統計相關的行數
2、顯示/var/log/secure檔案中包含“failed password”或者“failed login”的行;而後統計相關的行數。
3、顯示/var/log/secure檔案中記錄的屬于目前系統時間的前一天的資訊中包含“failed password”或者“failed login”的行,并統計行數
4、找出netstat -tan 指令執行的結果中以time_wait或者established結尾的行。
顯示某檔案中的一位數和兩位數。
grep ‘\<[:digit:]\{1,2\}\>’/etc/passwd
基本正規表達式:
. \? * \< $ ^ [] \{n,m\} 等。
擴充正規表達式:
.:任意單個字元
[]:指定範圍内的單個字元
[^]:取反
*:任意多個
+:比對其前面的字元至少1次。
?:0或1次
{n,m}:至少m次,至多n次。
():分組,與基本正規表達式不同的是不需要\
a|b:二選其一。
sort:
-f:忽略大小寫
-n:以數字大小寫排序(預設是以字元方式排序)
-u:排序過程中删除結果相同的行。
-r:降序排列
-R:随機排序。
uniq:選取唯一值。
-c:統計每行重複的次數。
-u:顯示沒有重複的行
-d:隻顯示重複過的行
-t:指定分隔符
-k:指定字段
查找/etc/passwd檔案中使用bash的uid最小的使用者名
grep 'bash' /etc/passwd |sort -n -t : -k 3 |head -n 1 |cut -d : -f 1
有變量、轉義字元的時候需要使用雙引号。
bash的配置檔案:
profile類:互動式登陸的使用者
/etc/profile (全局,對所有使用者有效)
/etc/profile.d/*.sh:全局,對所有使用者有效,是對profile的補充。
~/.bash_profile:僅對某使用者自己有效。
功能:設定環境變量、運作指令和腳本
basher類:非互動式登陸的使用者
/etc/bashrc:全局有效
~/.bashrc:僅對使用者自己有效。
功能:設定本地變量、定義使用者别名
假定新安裝jdk檔案,可執行指令為/usr/java/latest,需要指定環境變量(全局)JAVA_HOME。如何操作。
vi /etc/profile,也可在/etc/profile.d/建立一個配置檔案(java.sh),來進行配置。
添加: export JAVA_HOME=/etc/java/latest
. /etc/profile.d/java.sh 配置生效
echo $JAVA_HOME 檢視
在配置檔案更新後,新的定義不會立即生效,要想立即生效有兩種方式:
1、重新開機
2、source file
互動式模式就是shell等待你的輸入, 并且立即執行你送出的指令。這種模式被稱作互動式是因為shell與使用者進行互動。這種模式也是大多數使用者非常熟悉的:登入、執行一些指令、簽退。當你簽退後,shell也終止了。
shell也可以運作在另外一種模式:非互動式模式,以shell script(非互動)方式執行。在這種模式下,shell不與你進行互動,而是讀取存放在檔案中的指令,并且執行它們。當它讀到檔案的結尾,shell也就終止了
互動式登陸環境:
1、直接從終端登陸的使用者
2、su - username
非互動登陸:
1、su username
2、在圖形模式下,打開的一個僞終端。
3、執行腳本
讀取bash的順序:
互動式登陸:
/etc/profile-->/etc/profile.d/*.sh-->~/.bash.profile-->~/.bashrc-->/etc/bashrc 最後執行的優先級高
非互動式登陸:
~/.bshrc-->/etc/bashrc-->/etc/profile.d/*.d
I/O重定向,管道
file disciptor,檔案描繪符,FD
标準輸入fd:0
标準輸出fd:1
錯誤輸出fd:2
将預設資料流改為其他裝置,就稱為io重定向。
>:覆寫重定向
>>:追加重定向
2>:錯誤覆寫重定向
2>>:錯誤追加重定向
ls /usr >/tmp/1 2>/tmp/2 同時對正确和錯誤的輸出進行操作。
&>标準輸出和錯誤輸出合并重定向到一個檔案
&>>标準輸出和錯誤輸出合并追加到一個檔案。
輸入重定向:
<:輸入重定向
<<:此處建立檔案。通常用于腳本中文檔的生成
cat >/tmp/123 <<eof(eof可任意寫)
管道的最後一個指令是在目前shell的子shell中執行的,所有不要用變量擷取結果。
t指令可以将重定向和管道結合起來使用,就是在将前一個指令的結果輸出到螢幕的同時還可以儲存到檔案,也就是說可以管道到下一個指令中。
SED 非互動式文本編輯器
指令本身并不會更改源檔案内容,如果要将修改結果儲存下載下傳,請使用輸出重定向
sed逐條讀取檔案并放到模式空間裡,通過編輯指令進行執行并将結果保持到保留白間中。
指令格式:
sed [選項] 指令 文本檔案名
選項:
-n:不列印全部内容,預設情況是對文本全部内容輸出資訊。
-e:連接配接多條編輯指令
-f:指定腳本檔案
編輯指令:
p:列印比對行
=:顯示指定的行号
a\:在定位行号後添加新文本資訊,\表示換行
i\:在定位行前添加文本資訊
c\:用新文本替換定位位置文本内容
d:删除定位行
s:使用替換模式
r:從另一個檔案中讀文本并替換
一、查找指定範圍
1、x:具體行号
sed -n '2p' /etc/passwd
2、x,y:指定行範圍,1,7
sed -n '1,10p' /etc/passwd
3、/pattern/:查找包含模式的行,/disk/
sed -n '/nobody/p' /etc/passwd
4、x,/pattern/:從第n行開始到比對項之間的所有内容
sed -n '/nobody/,$p' passwd
5、/pattern/,y:從比對内容開始向下到第n行。
sed -n '1,/nobody/p' passwd
6、x,y!:排除指定的範圍
sed -n '1,30!p' passwd
7、1,$:顯示所有行
8、$:列印最後一行
sed -n '$p' passwd
二、列印行号
1、查找passwd檔案中的包含gong使用者的所在行号
sed '/gong/=' passwd
三、插入、替換指定内容
1、在passwd檔案,包含root的行後插入###############。
sed '/root/'a\ "###########" passwd
2、在passwd檔案,包含root的行前插入###############。
3、在passwd檔案,包含root的行替換為###############。
sed '/root/'c\ "############" passwd
4、在passwd檔案,删除###############。
sed "/####/"d passwd
四、替換文本
s/paterntofind/newpartern/[gpwn]
同i\a\的差別主要是:
i、a替換的是整行,而s替換的查找到的具體内容。
選項
g:全局查找替換所有符合的模式
1、替換passwd檔案中的gongbing 為liuhaixing
sed 's/gongbing/liuhaixiang/g' passwd
2、删除passwd檔案中的root
sed 's/root//g' passwd
&:表示對前一個模式所指的内容進行重新引用
比如: sed 's/gongbing/bingle &/g' passwd 表示在gongbing的前面添加一個bingle字元串。
顯示文本檔案的控制字元
1、cat -v passwd
2、sed '1.$l' passwd l:小寫l表示顯示控制符
五、删除行
d:用來删除比對的行。
sed ‘/^28/d’ /etc/passwd
删除檔案中以28開頭的行。
sed -ne ‘/[Ll]ixia/d’-e '/shanghai/d' -e p students
多比對内容之間的删除操作需要-e的配合。
元字元終極總結
字元(Characters)
字元組(Character classes)
元字元(Metacharacter) 比對(Matches)
[abc] simple class 比對 a 或 b 或 c
[^abc] negation 比對 abc 之外的任何單個字元
[a-zA-Z] range比對a到z或A到Z的任何單個字 符
[a-d[m-p]] union 等同于[a-dm-p]
[a-z&&[def]] intersection 比對 d, e 或 f
[a-z&&[^bc]] subtraction 等同于[ad-z]
預定義字元組(Predefined character classes)
. dot 任何字元,能不能比對換行符取決于比對 模式
\d digit 數字,等價于[0-9]
\D non-digit 非數字,等價于[^0-9]
\s whitespace 空白字元,等價于[ \t\n\x0B\f\r]
\S non-whitespace 非空白字元,等價于[^\s]
\w word 組成單詞的字元,等價于[a-zA-Z_0-9]
\W non-word 不是組成單詞的字元,等價于[^\w]
POSIX 字元組
[:lower:]: 小寫
[:upper:]: 大寫
[:digit:]: 數字
[:space;]: 空白字元
零長度斷言
^ caret 行首
$ dollar 行尾
\b boundary 單詞邊界
\B 非單詞邊界
\< 單詞的起始位置
\> 單詞的結束位置
\A 字元串起始位置
\Z 字元串結束位置
\z 字元串結束位置
\G 次比對的起始位置或上次比對的結束 位置
(?=...) positive lookahead 如果右邊能夠比對,則成功
(?!...) negative lookahead 如果右邊不能夠比對,則成功
(?<=...) positive lookbehind 如果左邊能夠比對,則成功
(?<!...) negative lookbehind 如果左邊不能夠比對,則成功
貪婪量詞
X? 比對 X 0次或1次
X* 比對 X 0次或無數次
X+ 比對 X 1次或無數次
X{n} 比對 X n 次
X{n,} 比對X 至少n次
X{n,m} 比對X 至少n次至多m次
非貪婪量詞
元字元(Metacharacter) 比對(Matches)
X?? 比對X0次或1次
X*? 比對X0次或無數次
X+? 比對X1次或無數次
X{n}? 比對Xn次
X{n,}? 比對X至少N次
X{n,m}? 比對X隻是N次至多M次
占有量詞
X?+ 比對 X 0次或1次
X*+ 比對 X 0次或無數次
X++ 比對 X 1次或無數次
X{n}+ 比對 X n 次
X{n,}+ 比對X 至少n次
X{n,m}+ 比對X 至少n次至多m次
分組,捕獲及後向引用
(...) 分組或捕獲
\n 引用第 n 個括号中比對的内容
(?<name>...) 命名捕獲
(?:...) 分組
(?>...) 固化分組
多選結構
元字元(Metacharacter) 比對 (Matches)
a|b|c 比對 a 或 b 或 c
條件判斷
元字元(Metacharacter) 比對(Matches)
(?if then |else)
條件為真,則比對 then 子表達式,否則比對 else 子表達式
比對模式
元字元(Metacharacter) 比對(Matches)
(?i:...) 不區分大小寫的比對模式
(?x:...) 注釋模式
(?s:...) 單行模式(點号通配模式)
(?m:...) 多行模式(增強的行錨點模式)
\Q...\E 文字文 模式
本文轉自 blackstome 51CTO部落格,原文連結:http://blog.51cto.com/137783/1895565,如需轉載請自行聯系原作者