Linux命令自整理
內核——shell——用戶,用戶通過shell命令與內核交互
Linux命令成千上萬,不可能每個命令都記得住如何用,這時候,可以使用man 命令打開命令幫助頁,查看命令怎麼用,如:
輸入q退出
分號(;)可以隔開同一行內多條命令,即多條命令按順序執行
LS
ls [option] [file or direction]
ll 等價於 ls –l
ls –lrt, l顯示文件的詳細信息,r按字母逆序或者最早優先的順序顯示輸出結果,t是顯示按修改時間排序
CP
cp [option] [source] [destination]
-r實現目錄遞歸複製,-a複製不改變文件生成時間
cp -r ./1023 ./tmp 實現目錄直接複製。
cp -ar ./1023 ./tmp 實現目錄直接複製,且不改變目錄的修改時間。
MV
mv [option] [source] [destination]
mv也可以適用於文件的重命名
規則都一樣,-f 不提示,-i會有提示操作,-r是對目錄遞歸操作,-p移動時保持權限
RM
rm [option] [file or direction]
mkdir
mkdir [option] [direction]
mkdir –m 777 direct (創建目錄並賦予權限,rwx讀寫執行權限)
mkdir –p路徑名 (創建目錄可以是一個路徑,如果父目錄不存在,則連父目錄一起創建)。
如:mkdir -p /opt/samba/tmp/111/222/333
cd 等效於 cd ~返回用戶目錄
cd - 返回上一次的目錄
文件權限
(-/d)(rwx)(rwx)(rwx)
(目錄or文件)(屬主用戶權限)(與文件屬主用戶的同組用戶權限)(其他用戶權限)
chmod
u表示用戶,g表組,o表示其他用戶,a表示所有,+表示增加權限,-表示刪除權限,=表示賦予給定權限並刪除其他權限
chmod u+x 1.txt,表示給這個文件增加可執行權限
chmod 777 賦予全部權限
查找命令find
find [路徑] [選項] [操作]
路徑表示要查找的目錄路徑,即在什麼路徑下查找,
選項用於指定查找條件,比如:可以按照更改時間,文件屬主,文件類型等方式查找,如:name根據文件名查找,mtime –n +n,-n表示更改時間在n天之內,+n表示修改時間在n天之前,type表示某一類型文件
操作用於指定結果的輸出方式,如print將查找的結果輸出
find . -name 'report*' -print
查找當前目錄下包括子目錄下的含有名稱爲”report”的文件或文件夾,並輸出
vi命令
一般模式,直接vi進去就是一般模式
w(保存),q,q!(強退),wq
x刪除字符,dd刪除正行
hjkl,左下上右光標移動,^移動到當前行第一個非空字符,$移動到當前行尾
:n移動到n行
/搜索單詞,?從下往上搜索,n查找下一個,N查找上一個,G直接到文件尾
插入模式,在一般模式下按i,o,a等字母都可以進入插入模式,按esc鍵可以返回到一般模式
正則表達式,空行:^$
^表示匹配以什麼開頭,但是在[]裏,^表示是取反的意思
如匹配任意英文單詞匹配法:
[A-Za-z] [A-Za-z]*
\<\>表示精確匹配,\<the\>表示精確匹配the這個單詞,tther將不會被匹配到
awk,perl,grep還支持正則表達式
grep命令可以是字符串,可以是變量,也可以是正則表達式
如:grep ‘Hello word’ filename.txt
grep “Hello world” f1.txt f2.txt (多文件grep)
grep “Hello world” f?.txt,表示查找f1.txt,f2.txt下的文件
grep –n “Hello world” f*.txt 查找Hello world的文件並顯示文件所在的行數
grep -i 表示不區分大小寫
grep -l Hello 1.txt只顯示文件名
grep –r helloworld * ,,,,-r表示遞歸搜索,不僅搜索本目錄,還包括子目錄
grep [Hh]ello 1.txt 查找Hello,hello的行
grep ^/…./ 1.txt 查找以/開頭,中間包含任意4個字符,第六個字符任是/的行,如/home/滿足條件
grep www\.baidu\.com 1.txt ,,查找含有www.baidu.com的行
grep ‘\<the\>’ 1.txt 精確匹配含有the單詞的行,等同於grep –wthe 1.txt,-w是匹配整詞.
grep –E “OA|ab” 1.txt,查找含有OA或ab的行,-E表示支持正則表達式,如果沒有-E,|這個符號會被當作字符來處理,-E才表示|是或的意思。
grep –F “OA|ab” 1.txt 不支持正則表達式.
grep –v 顯示不包含匹配文本的所有行
grep進程,但不包含自己
ps -ef|grep java|grep -v grep
grep命令族
egrep 擴展grep命令,支持基本和擴展正則表達式。相當於 grep -E
fgrep 快速grep命令,不支持正則表達式,按照字符串的字面意思進行匹配。相當於grep –F
文本處理工具sed和awk命令
sed只是針對原始文件的副本進行編輯,不編輯原始文件。如果需要保存改動內容,需要重定向>
sed [選項] ‘sed命令’ 輸入文件
sed –n不打印源文件所有行輸出
sed –f 表示正在調用sed腳本文件
sed命令通常由定位文本行和sed編輯命令兩部分組成
使用行號,指定一行或者指定行號範圍
使用正則表達式
Sed編輯命令
p打印匹配行
=打印文件號
a\在定位行號之後追加文本信息
i\在定位行號之前追加文本信息
d刪除定位行
c\用新文本替換定位文本
s使用替換模式替換相應模式
r從另外一個文件中讀文本
w將文本寫入到另外一個文件中
sed–n ‘1p’ input.txt 只打印第一行,1是定位文本,第一行,p是編輯命令,打印匹配行
sed -n '1,3p' server.log 只打印第1-3行,
利用sed命令打印模式匹配行,用/patten/方法進行模式匹配
sed -n '/Starting/p' server.log
sed 編輯命令可以放在’’裏面,也可以放在外面
sed -n '/Starting/'p server.log
log.txt
[root@bogon tmp]# cat log.txt
This is a book ..
We learn Linux.
How are you.
Here you are .
[root@bogon tmp]#
插入文本i\(前面) 或者 a\(追加)
insert.sed
[root@bogon tmp]# cat insert.sed
#!/bin/sed -f
/Here/i\
Here insert a new line
執行腳本
./insert.sed log.txt
得到結果:匹配含有Here的行,並在該行前面(i\)添加Here insert a new line
[root@bogon tmp]# ./insert.sed log.txt
This is a book ..
We learn Linux.
How are you.
Here insert a new line
Here you are .
[root@bogontmp]#
這個只是輸出到控制檯,並沒有改log.txt文件
修改文本c\
將匹配的文本,用新文本替代,用編輯命令爲c\,修改文本的格式爲:
sed ‘匹配文本 c\替換文本’ 輸入文件
log.txt
[root@bogon tmp]# cat log.txt
This is a book ..
We learn Linux.
How are you.
Here you are .
[root@bogon tmp]#
modify.sed文件:
[root@bogon tmp]# cat modify.sed
#!/bin/sed -f
/Here/c\
we modify this line.
[root@bogon tmp]#
執行modify.sed文件,修改文本:
[root@bogon tmp]# ./modify.sed log.txt
This is a book ..
We learn Linux.
How are you.
we modify this line.
[root@bogon tmp]#
刪除文本d
sed ‘1d’ log.txt 刪除第一行
sed ‘1,10d’ log.txt 刪除1-10行
sed ‘5,$d’ log.txt 刪除5到最後一行
sed ‘$d’ log.txt 刪除最後一行
sed '/This/'d log.txt 刪除匹配This的行,d可以在’’內外都可以。
[root@bogon tmp]# cat log.txt
This is a book ..
We learn Linux.
How are you.
Here you are .
[root@bogon tmp]# sed '1d' log.txt
We learn Linux.
How are you.
Here you are .
[root@bogon tmp]# sed '$d' log.txt
This is a book ..
We learn Linux.
How are you.
Here you are .
[root@bogon tmp]#
[root@bogon tmp]# sed '/This/'d log.txt
We learn Linux.
How are you.
Here you are .
[root@bogon tmp]#
替換文本 s/
s /被替換的字符串/新字符串/ [替換選項]
sed 's/Here/Where/' log.txt
[root@bogon tmp]# sed 's/Here/Where/'log.txt
This is a book ..
We learn Linux.
How are you.
Where you are .
[root@bogon tmp]#
與-n結合,p只打印替換行。
sed -n 's/Here/Where/p' log.txt
[root@bogon tmp]# sed -n 's/Here/Where/p'log.txt
Where you are .
[root@bogon tmp]#
sed -n 's/Here/Where/pg' log.txt
[root@bogon tmp]# sed -n 's/Here/Where/pg'log.txt
Where you are .
[root@bogon tmp]#
g是替換所有出現的地方,當匹配的那行出現兩個相同的匹配時,g才起作用。
tr命令
通過使用 tr,您可以非常容易地實現sed 的許多最基本功能。您可以將 tr 看作爲 sed 的(極其)簡化的變體:它可以用一個字符來替換另一個字符,或者可以完全除去一些字符。您也可以用它來除去重複字符。這就是所有 tr 所能夠做的。
tr用來從標準輸入中通過替換或刪除操作進行字符轉換。tr主要用於刪除文件中控制字符或進行字符轉換。使用tr時要轉換兩個字符串:字符串1用於查詢,字符串2用於處理各種轉換。tr剛執行時,字符串1中的字符被映射到字符串2中的字符,然後轉換操作開始。
tr ["string1_to_translate_from"]["string2_to_translate_to"] < input-file
將string1替換爲string2
-c是表示用string1的補集替換爲string2
帶有最常用選項的tr命令格式爲:
tr -c -d -s["string1_to_translate_from"] ["string2_to_translate_to"]< input-file
-c 將字符串1中字符集的補集替換爲此字符集string2,要求字符集string2爲ASCII。
-d 刪除字符串1中所有輸入字符。
-s 刪除所有重複出現字符序列,只保留第一個;即將重複出現字符串壓縮爲一個字符串。
input-file是轉換文件名。雖然可以使用其他格式輸入,但這種格式最常用。
字符範圍
指定字符串1或字符串2的內容時,只能使用單字符或字符串範圍或列表。
[a-z] a-z內的字符組成的字符串。
[A-Z] A-Z內的字符組成的字符串。
[0-9] 數字串。
\octal 一個三位的八進制數,對應有效的ASCII字符。
[O*n] 表示字符O重複出現指定次數n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表達方式
速記符含義八進制方式
\a Ctrl-G 鈴聲\007
\b Ctrl-H 退格符\010
\f Ctrl-L 走行換頁\014
\n Ctrl-J 新行\012
\r Ctrl-M 回車\015
\t Ctrl-I tab鍵\011
\v Ctrl-X \030
實例:
將文件file中出現的" el "替換爲"ab"
[root@bogon tmp]# cat newfile
ss
hello world
[root@bogon tmp]# cat newfile | tr"el" "ab"
ss
habbo worbd
[root@bogon tmp]#
【注意】這裏,凡是在file中出現的"e"字母,都替換成"a"字母,"l"字母替換爲"b"字母。而不是將字符串"el"替換爲字符串"ab"。
使用tr命令“統一”字母大小寫
(小寫 --> 大寫)
# cat file | tr [a-z] [A-Z] > newfile
(大寫 --> 小寫)
# cat file | tr [A-Z] [a-z] > newfile
把文件中的數字0-9替換爲a-j
# cat file | tr [0-9] [a-j] > newfile
4、刪除文件file中出現的"Snail"字符
# cat file | tr -d "Snail" >newfile
【注意】這裏,凡是在file文件中出現的'S','n','a','i','l'字符都會被刪除!而不是緊緊刪除出現的"Snail”字符串。
[root@bogon tmp]# cat newfile | tr [a-z][A-Z]
SS
HELLO WORLD
[root@bogon tmp]# cat newfile | tr [A-Z][a-z]
ss
hello world
[root@bogon tmp]#
[root@bogon tmp]# cat newfile | tr -d"hello"
ss
wrd
[root@bogon tmp]#
【注意】這裏,凡是在file文件中出現的'h','e','l','l','0'字符都會被刪除!而不是緊緊刪除出現的"hello”字符串。
5、刪除文件file中出現的換行'\n'、製表'\t'字符
# cat file | tr -d "\n\t" >new_file
不可見字符都得用轉義字符來表示的,這個都是統一的。
[root@bogon tmp]# cat newfile | tr -d"\n\t"
sshello world[root@bogon tmp]#
6、刪除“連續着的”重複字母,只保留第一個
# cat file | tr -s [a-zA-Z] > new_file
[root@bogon tmp]# cat newfile | tr -s [a-z]
s
helo world
[root@bogon tmp]#
7、刪除空行
# cat file | tr -s "\n" >new_file
8、刪除Windows文件“造成”的'^M'字符(回車)
# cat file | tr -d "\r" >new_file
或者
# cat file | tr -s "\r""\n" > new_file
【注意】這裏-s後面是兩個參數"\r"和"\n",用後者替換前者
即\n替換\r,加上-s,就去重\n,只出現一個\n
awk
awk調用與sed類似,也有三種方式
一種爲shell命令行方式,另外兩種是將awk程序寫入腳本文件,然後執行該腳本文件。
任何awk語句都由模式(pattern)和動作(action)組成。
[root@bogon tmp]# awk '/^$/{print"this is a blank"}' log.txt
this is a blank
[root@bogon tmp]#
awk '/^$/{print "this is ablank"}' log.txt
這是awk的第一種調用方式,單引號中間是awk命令,該awk命令由兩部分組成,以/符號分隔,^$部分是模式,花括號部分是動作,該命令表示一旦讀入的是空行,就打印”this is a blank” 。^$是正則表達式,表示空白行,print表示該動作是打印操作,log.txt表示輸入的文件。
awk的第二種調用方式
awk -f [命令文件] 文本文件
awk -f src.awk log.txt
[root@bogon tmp]# cat src.awk
/^$/{print "this is a blank"}
[root@bogon tmp]#
[root@bogon tmp]# awk -f src.awk log.txt
this is a blank
[root@bogon tmp]#
awk的第三種調用方式
直接執行awk腳本文件來調用,與sed方法一樣,腳本內容:
[root@bogon tmp]# cat src1.awk
#!/bin/awk -f
/^$/{print "this is a blank"}
[root@bogon tmp]#
[root@bogon tmp]# ./src1.awk log.txt
this is a blank
[root@bogon tmp]#
記錄和域
Hi Man 400-111111
Hi, Man,400-111111共3個域,兩個或兩個以上空格,或者tab鍵當作一個分隔符來處理,對文本文件分域處理是Linux系統中很多命令都使用的方法。
awk定義域操作符$來指定執行當作的域,如$1表示第一個操作域,$2表示第二個,$0表示所有域
[root@bogon tmp]# cat source.txt
Li Hao kkk123456
Li Si ddd123466
zhang san fff 123467
[root@bogon tmp]# awk '{print$1,$2,",",$4,$3}' source.txt
Li Hao , 123456 kkk
Li Si , 123466 ddd
zhang san , 123467 fff
[root@bogon tmp]#
[root@bogon tmp]# awk '{print $0}'source.txt
Li Hao kkk123456
Li Si ddd123466
zhang san fff 123467
[root@bogon tmp]#
$後面還可以跟變量
[root@bogon tmp]# awk 'BEGIN {one=1;two=2}{print $(one + two)}' source.txt
kkk
ddd
fff
[root@bogon tmp]#
實際就是print $3
awk –F可以改變分隔域,如用Tab鍵來當作分隔域
awk –F”\t” ‘{print $3}’ source.txt
[root@bogon tmp]# awk -F"\t"'{print $2}' source.txt
kkk 123456
ddd 123466
fff123467
[root@bogon tmp]#
儘管-F可以改變分隔符,但是awk還提供了另一種更方便的方法來改變分隔符,這就是改變awk環境變量FS,
[root@bogon tmp]# awk 'BEGIN {FS=","}{print $1,$3}' source1.txt
Li Hao 123456
Li Si 123466
zhang san 123467
[root@bogon tmp]#
關係和布爾運算符
awk定義了一組關係運算符用於awk模式匹配,
匹配第一個域中含有Li的行
[root@bogon tmp]# awk 'BEGIN{FS=","} $1~/Li/' source1.txt
Li Hao,kkk,123456
Li Si,ddd,123466
[root@bogon tmp]#
不匹配第一個域中含有Li的行
[root@bogon tmp]# awk 'BEGIN{FS=","} $1!~/Li/' source1.txt
zhang san,fff,123467
[root@bogon tmp]#
打印第三域大於123466的行
[root@bogon tmp]# awk 'BEGIN{FS=","} {if($3 >= 123466) print $0}' source1.txt
Li Si,ddd,123466
zhang san,fff,123467
[root@bogon tmp]#
awk '/^$/{print x+=1}' source1.txt 打印空白行的序號 。
[root@bogon tmp]# cat source1.txt
Li Hao,kkk,123456
Li Si,ddd,123466
zhang san,fff,123467
[root@bogon tmp]#
[root@bogon tmp]# awk '/^$/{print x+=1}'source1.txt
1
2
3
source2.txt存放的是學生姓名以及最後三列存放的是成績,用awk計算每個學生的平均成績.
[root@bogon tmp]# cat source2.txt
Li Hao,kkk,82,92,69
Li Si,ddd,96,74,88
zhang san,fff,75,72,74
[root@bogon tmp]#
[root@bogon tmp]# cat src2.awk
#!/bin/awk -f
BEGIN {FS=","}
{total=$3+$4+$5
avg=total/3
print $1,avg}
[root@bogon tmp]#
[root@bogon tmp]# ./src2.awk source2.txt
Li Hao 81
Li Si 86
zhang san 73.6667
[root@bogon tmp]#
awk環境變量
awk定義了很多環境變量,我們稱他們爲系統變量
[root@bogon tmp]# awk 'BEGIN{FS=","} {printf("%s\t%d\t%d\r\n",$1,$3,$4)}' source2.txt
Li Hao 82 92
Li Si 96 74
zhang san 75 72
[root@bogon tmp]#
%-15s表示長度控制在15位,不夠長用空格補齊
[root@bogon tmp]# awk 'BEGIN{FS=","} {printf("%-15s\t%d\t%d\r\n",$1,$3,$4)}' source2.txt
Li Hao 82 92
Li Si 96 74
zhang san 75 72
[root@bogon tmp]#
awk 'BEGIN {FS=",";print"Name\t\tMach\t\tEnglish"}{printf("%-15s\t%d\t%d\r\n",$1,$3,$4)}' source2.txt
[root@bogon tmp]# awk 'BEGIN{FS=",";print "Name\t\tMach\t\tEnglish"}{printf("%-15s\t%d\t%d\r\n",$1,$3,$4)}' source2.txt
Name Mach English
Li Hao 82 92
Li Si 96 74
zhang san 75 72
[root@bogon tmp]#
內置字符串函數
[root@bogon tmp]# awk 'BEGIN{FS=",";OFS=","} gsub(/Li/,"Zhang") {print $0}'source2.txt
Zhang Hao,kkk,82,92,69
Zhang Si,ddd,96,74,88
[root@bogon tmp]#
FS是源文件分隔符,OFS是輸出作用域分隔符,gsub方法把Li替換成Zhang
結果只替換了兩行
index輸出ll在Hello出現的位置。
[root@bogon tmp]# awk 'BEGIN {printindex("Hello","ll")}'
3
[root@bogon tmp]#
length輸出字符串長度
[root@bogon tmp]# awk 'BEGIN {printlength("Hello")}'
5
[root@bogon tmp]#
sort
-t按分隔符進行排序,默認是按第一作用域排序
[root@bogon tmp]# sort -t, source2.txt
Li Hao,kkk,82,92,69
Li Si,ddd,96,74,88
zhang san,fff,75,72,74
[root@bogon tmp]#
-k指定按某作用域排序,且默認是按字符串方式排序
[root@bogon tmp]# sort -t, -k3 source2.txt
zhang san,fff,75,72,74
Li Hao,kkk,82,92,69
Li Si,ddd,96,74,88
[root@bogon tmp]#
如果要讓它按照數字大小排序,可加n
[root@bogon tmp]# sort -t, -k3n source2.txt
zhang san,fff,75,72,74
Li Hao,kkk,82,92,69
Li Si,ddd,96,74,88
[root@bogon tmp]#
如果要按逆向排序,可加r
[root@bogon tmp]# sort -t, -k3nrsource2.txt
Li Si,ddd,96,74,88
Li Hao,kkk,82,92,69
zhang san,fff,75,72,74
[root@bogon tmp]#
-u 去除結果中的重複行
[root@bogon tmp]# sort -t, -k3nrsource2.txt
Li Si,ddd,96,74,88
Li Si,ddd,96,74,88
Li Hao,kkk,82,92,69
zhang san,fff,75,72,74
[root@bogon tmp]#
Li Si那行有兩條記錄,是重複的,要只顯示一條,可加-u
[root@bogon tmp]# sort -t, -k3nr -usource2.txt
Li Si,ddd,96,74,88
Li Hao,kkk,82,92,69
zhang san,fff,75,72,74
[root@bogon tmp]#
-o
如果要將排序後的結果輸出到某個文件,可以用-o,後面加文件名
[root@bogon tmp]# sort -t, -k3nr -u -osource3.txt source2.txt
[root@bogon tmp]# cat source3.txt
Li Si,ddd,96,74,88
Li Hao,kkk,82,92,69
zhang san,fff,75,72,74
[root@bogon tmp]#
tar
tar [選項] [新包名] 文件名或目錄名
tar -cvf source.tar source*
將所有的source*文件打包進source.tar裏面
[root@bogon tmp]# tar -cvf source.tarsource*
source1.txt
source2.txt
source3.txt
source.txt
完成後就發現有source.tar
source.tar
要想查看包的內容(不解壓),可以用tf
tar -tf source.tar
[root@bogon tmp]# tar -tf source.tar
source1.txt
source2.txt
source3.txt
source.txt
[root@bogon tmp]#
tar –u可以更新包中的文件,如果包中沒有這個文件,則添加進包中
[root@bogon tmp]# tar -uf source.tarsource.txt
[root@bogon tmp]#
解壓
tar –xvf 壓縮包名稱 #解壓非gzip格式的壓縮包
tar –zxvf 壓縮包名稱 #解壓gzip格式的壓縮包
tar –cf命令創建的包實際上是將多個文件放到一起,並沒有壓縮,gzip命令是Linux中常用的壓縮工具,它可以對tar命令創建的包進行壓縮
[root@bogon tmp]# ll
total 52
-rwxr-xr-x. 1 root root 48 Nov 17 22:57 insert.sed
-rwxrwxrwx. 1 root root 64 Nov 17 23:10 log.txt
-rwxr--r--. 1 root root 45 Nov 17 23:08 modify.sed
-rw-r--r--. 1 root root 59 Nov 19 22:39 source1.txt
-rw-r--r--. 1 root root 81 Nov 20 00:51 source2.txt
-rw-r--r--. 1 root root 62 Nov 20 00:53 source3.txt
-rw-r--r--. 1 root root 10240 Dec 1 23:19 source.tar
-rw-r--r--. 1 root root 57 Nov 19 19:30 source.txt
-rwxr--r--. 1 root root 45 Nov 18 23:37 src1.awk
-rwxr--r--. 1 root root 71 Nov 19 22:51 src2.awk
-rwxr--r--. 1 root root 31 Nov 18 22:59 src.awk
壓縮前source.tar 有10240B
[root@bogon tmp]# gzip source.tar
[root@bogon tmp]# ll
total 44
-rwxr-xr-x. 1 root root 48 Nov 17 22:57 insert.sed
-rwxrwxrwx. 1 root root 64 Nov 17 23:10 log.txt
-rwxr--r--. 1 root root 45 Nov 17 23:08 modify.sed
-rw-r--r--. 1 root root 59 Nov 19 22:39 source1.txt
-rw-r--r--. 1 root root 81 Nov 20 00:51 source2.txt
-rw-r--r--. 1 root root 62 Nov 20 00:53 source3.txt
-rw-r--r--. 1 root root 307 Dec 1 23:19 source.tar.gz
-rw-r--r--. 1 root root 57 Nov 19 19:30 source.txt
-rwxr--r--. 1 root root 45 Nov 18 23:37 src1.awk
-rwxr--r--. 1 root root 71 Nov 19 22:51 src2.awk
-rwxr--r--. 1 root root 31 Nov 18 22:59 src.awk
[root@bogon tmp]#
壓縮後有307B,而且包名變爲source.tar.gz
解壓,需要解壓包內所有文件,用tar –zxvf source.tar.gz
[root@bogon tmp]# ll
total 4
-rw-r--r--. 1 root root 307 Dec 1 23:19 source.tar.gz
[root@bogon tmp]# tar -zxvf source.tar.gz
source1.txt
source2.txt
source3.txt
source.txt
[root@bogon tmp]# ll
total 20
-rw-r--r--. 1 root root 59 Nov 19 22:39 source1.txt
-rw-r--r--. 1 root root 81 Nov 20 00:51 source2.txt
-rw-r--r--. 1 root root 62 Nov 20 00:53 source3.txt
-rw-r--r--. 1 root root 307 Dec 1 23:19 source.tar.gz
-rw-r--r--. 1 root root 57 Nov 19 19:30 source.txt
[root@bogon tmp]#
gzip –d 命令可以還原source.tar.gz到source.tar,不解壓文件。
[root@bogon tmp]# gzip -d source.tar.gz
[root@bogon tmp]# ll
total 28
-rw-r--r--. 1 root root 59 Nov 19 22:39 source1.txt
-rw-r--r--. 1 root root 81 Nov 20 00:51 source2.txt
-rw-r--r--. 1 root root 62 Nov 20 00:53 source3.txt
-rw-r--r--. 1 root root 10240 Dec 1 23:19 source.tar
-rw-r--r--. 1 root root 57 Nov 19 19:30 source.txt
[root@bogon tmp]#
變量和引用
[root@bogon tmp]# variable1=1
[root@bogon tmp]# echo $variable1
1
[root@bogon tmp]#
變量間有空格,應該用“”括起來
[root@bogon tmp]# mmm="HelloWorld"
[root@bogon tmp]# echo $mmm
Hello World
[root@bogon tmp]#
unset命令可以清除變量的值
unset 變量名
[root@bogon tmp]# unset mmm
[root@bogon tmp]# echo $mmm
[root@bogon tmp]#
環境變量
環境變量適用於所有登錄進程所產生的子進程.
變量名=變量值 #環境變量賦值
export 變量名
環境變量的名稱一般由大寫字母組成.
清除環境變量跟清除變量一樣,用unset
[root@bogon Desktop]# APPSPATH=/usr/local
[root@bogon Desktop]# export APPSPATH
[root@bogon Desktop]# echo $APPSPATH
/usr/local
[root@bogon Desktop]#
可以看到剛纔設置的APPSPATH值
[root@bogon Desktop]# env|grep APPSPATH
APPSPATH=/usr/local
[root@bogon Desktop]#
重要的環境變量
PWD變量存的是當前目錄路徑,OLDPWD存放的是上一個目錄路徑
cd切換到其他目錄時,系統會自動修改這兩個變量的值
[root@bogon ~]# echo $PWD
/root
[root@bogon ~]# echo $OLDPWD
/root/Desktop
[root@bogon ~]#
PATH是Linux中極爲重要的一個環境變量,它用於幫助Shell找到用戶所輸入的命令.各個目錄用冒號分割。
[root@bogon ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
修改PATH變量可以如下:
[root@bogon ~]# exportPATH="/usr/local":$PATH
[root@bogon ~]# echo $PATH
/usr/local:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
[root@bogon ~]#
在HOME目錄,Linux以.開頭的文件爲隱藏文件
ll –a可以查看到所有的文件。
$HOME/.bash_profile是最重要的配置文件,當某linux用戶登錄時,Shell會自動執行.bash_profile文件
[root@bogon ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
.~/.bashrc
fi
# User specific environment and startupprograms
PATH=$PATH:$HOME/bin
export PATH
[root@bogon ~]#
可以看到,.bash_profile做了些初始化環境變量的操作
$HOME下的.bash_profile是用戶的環境變量,影響的是單用戶, 而/etc/profile是系統的環境變量,影響全部用戶
修改了環境變量,仍然需要source /etc/profile生效
以下是輔助知識:
Linux 的變量可分爲兩類:環境變量和本地變量
環境變量,或者稱爲全局變量,存在與所有的shell 中,在你登陸系統的時候就已經有了相應的系統定義的環境變量了。Linux 的環境變量具有繼承性,即子shell 會繼承父shell 的環境變量。
本地變量,當前shell 中的變量,很顯然本地變量中肯定包含環境變量。Linux 的本地變量的非環境變量不具備繼承性。
Linux 中環境變量的文件
當你進入系統的時候,linux就會爲你讀入系統的環境變量,這些環境變量存放在什麼地方,那就是環境變量的文件中。Linux 中有很多記載環境變量的文件,它們被系統讀入是按照一定的順序的。
1. /etc/profile :
此文件爲系統的環境變量,它爲每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。並從/etc/profile.d 目錄的配置文件中搜集shell 的設置。
這個文件,是任何用戶登陸操作系統以後都會讀取的文件(如果用戶的shell 是csh 、tcsh 、zsh ,則不會讀取此文件),用於獲取系統的環境變量,只在登陸的時候讀取一次。
假設用戶使用的是BASH ,那麼
2. /etc/bashrc :
在執行完/etc/profile 內容之後,如果用戶的SHELL 運行的是bash ,那麼接着就會執行此文件。另外,當每次一個新的bash shell 被打開時, 該文件被讀取。
每個使用bash 的用戶在登陸以後執行完/etc/profile中內容以後都會執行此文件,在新開一個bash 的時候也會執行此文件。因此,如果你想讓每個使用bash 的用戶每新開一個bash 和每次登陸都執行某些操作,或者給他們定義一些新的環境變量,就可以在這個裏面設置。
3. ~/.bash_profile :
每個用戶都可使用該文件輸入專用於自己使用的shell 信息。當用戶登錄時,該文件僅僅執行一次,默認情況下,它設置一些環境變量,執行用戶的.bashrc 文件。
單個用戶此文件的修改只會影響到他以後的每一次登陸系統。因此,可以在這裏設置單個用戶的特殊的環境變量或者特殊的操作,那麼它在每次登陸的時候都會去獲取這些新的環境變量或者做某些特殊的操作,但是僅僅在登陸時。
4. ~/.bashrc :
該文件包含專用於單個人的bash shell 的bash 信息,當登錄時以及每次打開一個新的shell 時, 該該文件被讀取。
單個用戶此文件的修改會影響到他以後的每一次登陸系統和每一次新開一個bash 。因此,可以在這裏設置單個用戶的特殊的環境變量或者特殊的操作,那麼每次它新登陸系統或者新開一個bash ,都會去獲取相應的特殊的環境變量和特殊操作。
~/.bash_logout :
當每次退出系統( 退出bash shell) 時, 執行該文件。
幾個命令
env 和printenv
這兩個變量用於打印所有的環境 變量:
set
用於顯示與設置當前本地變量。單獨一個set 就顯示了當前環境的所有的變量,它肯定包括環境變量和一些非環境變量
unset
用於清除變量。不管這個變量是環境變量還是本地變量,它都可以清除。
位置參數
從命令行向Shell腳本傳遞參數,$1表示第一個參數,$2表示第二個參數,$*和$@一樣,表示所有參數,$0表示腳本名稱,$#表示傳遞參數的數量,$$腳本運行的進程號,$?命令的退出狀態,0表示沒有錯,非0表示有錯誤。
[root@bogon ~]# cat position
#!/bin/sh
echo "The script name is : $0"
echo "Parameter #1:$1"
echo "Parameter #2:$2"
echo "Parameter #3:$3"
echo "-----------------------"
echo "All the command line parametersare : $*"
echo "The number of command lineparameters is:$#"
echo "The process ID is:$$"
echo "Did this script have anyerrors?$?"
[root@bogon ~]#
[root@bogon ~]# ./position How are you
The script name is : ./position
Parameter #1:How
Parameter #2:are
Parameter #3:you
-----------------------
All the command line parameters are : Howare you
The number of command line parameters is:3
The process ID is:2736
Did this script have any errors?0
[root@bogon ~]#
引用
雙引號“”表示引用除美元符號($),反引號(`),反斜槓外的所有字符
單引號’’表示引用所有字符
``反引號表示系統命令
\反斜槓表示轉義符,屏蔽下一個字符的特殊意義。
[root@bogon tmp]# cat double.sh
#!/bin/bash
variable=2001
echo "$variable"
echo $variable
variable2="X Y Z"
echo "$variable2"
echo $variable2
[root@bogon tmp]#
[root@bogon tmp]# ./double.sh
2001
2001
X Y Z
X Y Z
[root@bogon tmp]#
單引號和雙引號的區別:
[root@bogon tmp]# echo "$PWD is adirecty"
/root/tmp is a directy
[root@bogon tmp]# echo '$PWD is a directy'
$PWD is a directy
命令替換
命令替換是指將命令的標準輸出作爲值賦給某個變量,bash shell定義了兩種語法進行命令替換,一種是使用反引號(``),另一種是利用$(),兩種等價,語法如下:
`Linux命令`
$(Linux命令)
比如:pwd是顯示當前工作目錄的命令,`pwd`和$(pwd)等價,值都爲當前工作目錄,與環境變量$PWD一致
[root@bogon tmp]# echo `who`
root tty1 2014-12-03 17:15 (:0) root pts/02014-12-03 17:18 (:0.0)
[root@bogon tmp]# echo `world`
bash: world: command not found
[root@bogon tmp]# echo `date`
Wed Dec 3 17:46:59 PST 2014
[root@bogon tmp]#
[root@bogon tmp]# dirlist=`ls -l|grepsource`
[root@bogon tmp]# echo $dirlist
-rw-r--r--. 1 root root 59 Nov 19 22:39source1.txt -rw-r--r--. 1 root root 81 Nov 20 00:51 source2.txt -rw-r--r--. 1root root 62 Nov 20 00:53 source3.txt -rw-r--r--. 1 root root 57 Nov 19 19:30source.txt
[root@bogon tmp]# echo "$dirlist"
-rw-r--r--. 1 root root 59 Nov 19 22:39 source1.txt
-rw-r--r--. 1 root root 81 Nov 20 00:51 source2.txt
-rw-r--r--. 1 root root 62 Nov 20 00:53 source3.txt
-rw-r--r--. 1 root root 57 Nov 19 19:30 source.txt
[root@bogon tmp]#
儘管``和$()是等價,但$()可以嵌套
$?可以查看上一次命令的執行結果
[root@bogon tmp]# echo $?
0
[root@bogon tmp]#
測試
測試命令可以用於測試表達式的條件的真假。
測試命令有兩種,一種是用test expression,另一種是更爲可讀的,[ expression ],注意expression前後要有空格,[]經常與if else使用
整數比較運算符:
[root@bogon tmp]# num1=15
[root@bogon tmp]# [ "$num1" -eq15 ]
[root@bogon tmp]# echo $?
0
[root@bogon tmp]#
[root@bogon tmp]# [ $num1 -eq 15 ]
[root@bogon tmp]# echo $?
0
[root@bogon tmp]#
[root@bogon tmp]# [ $num1 -ge 15 ]
[root@bogon tmp]# echo $?
0
[root@bogon tmp]#
[root@bogon tmp]# [ $num1 -gt 15 ]
[root@bogon tmp]# echo $?
1
[root@bogon tmp]#
字符串運算符:
-n string 判斷字符串不爲空
-z string 判斷字符串爲空
string1 = string2 是否相同
string1 != string2 是否不同
判斷
if/else,if/elif/else和case
單if
if expression
then
command
command
fi
[root@bogon tmp]# cat if_exam.sh
#!/bin/bash
#input a number
echo "Please input a number:"
read integer1
if [ "$integer1" -gt 15 ]
then echo "the number you input islarge 15"
fi
[root@bogon tmp]#
[root@bogon tmp]# ./if_exam.sh
Please input a number:
11
[root@bogon tmp]# ./if_exam.sh
Please input a number:
16
the number you input is large 15
[root@bogon tmp]#
if/elif/else
[root@bogon tmp]# cat if_exam.sh
#!/bin/bash
#input a number
echo "Please input a number:"
read integer1
if [ "$integer1" -gt 15 ]
then
echo "the number you input is large15"
elif [ "$integer1" -eq 15 ]
then
echo "the number you input is equal15"
else
echo "the number you input is small15"
fi
[root@bogon tmp]#
[root@bogon tmp]# ./if_exam.sh
Please input a number:
15
the number you input is equal 15
[root@bogon tmp]#
case 結構
case variable in
value1)
command
…..
command;;
value2)
command;;
*)
command;;
esac
[root@bogon tmp]# cat case_exam.sh
#!/bin/bash
echo "Please input a day:"
read day
case "$day" in
1)
echo "Monday"
echo "Mon";;
2)
echo "Tur";;
3)
echo "Wed";;
4)
echo "Thu";;
5)
echo "Fri";;
6)
echo "Sat";;
7)
echo "Sun";;
*)
echo "input error"
esac
[root@bogon tmp]#
[root@bogon tmp]# ./case_exam.sh
Please input a day:
1
Monday
Mon
[root@bogon tmp]# ./case_exam.sh
Please input a day:
7
Sun
[root@bogon tmp]# ./case_exam.sh
Please input a day:
0
input error
[root@bogon tmp]#
數字常量
在linux中,shell用num#表示不同的進制,
[root@bogon tmp]# cat constant_exam.sh
#!/bin/bash
let "num1=40"
echo "num1=$num1"
let "num2=040"
echo "num2=$num2"
let "num3=0x40"
echo "num3=$num3"
let "num4=6#40"
echo "num4=$num4"
[root@bogon tmp]#
[root@bogon tmp]# ./constant_exam.sh
num1=40
num2=32
num3=64
num4=24
[root@bogon tmp]#
for循環
for variable in {list}
do
command
command
done
[root@bogon tmp]# cat for_exam.sh
#!/bin/bash
for variable in 1 2 3 4 5
do
echo"Hello World"
done
[root@bogon tmp]# ./for_exam.sh
Hello World
Hello World
Hello World
Hello World
Hello World
[root@bogon tmp]#
[root@bogon tmp]# cat for_exam2.sh
#!/bin/bash
for file in $( ls )
do
echo"file: $file"
done
[root@bogon tmp]#
[root@bogon tmp]# ./for_exam2.sh
file: case_exam.sh
file: constant_exam.sh
file: double.sh
file: for_exam2.sh
file: for_exam.sh
file: if_exam.sh
file: insert.sed
file: log.txt
file: modify.sed
file: source1.txt
file: source2.txt
file: source3.txt
file: source.txt
file: src1.awk
file: src2.awk
file: src.awk
file: text
file: tmp
[root@bogon tmp]#
讀取入參for循環
[root@bogon tmp]# cat for_exam3.sh
#!/bin/bash
echo "number of arguments is $#"
for arg in $*
do
echo"$arg"
done
[root@bogon tmp]#
[root@bogon tmp]# ./for_exam3.sh 1 2 3
number of arguments is 3
1
2
3
[root@bogon tmp]#
類C風格for循環
[root@bogon tmp]# cat for_exam4.sh
#!/bin/bash
for(( i=1;i<5;i++ ))
do
echo"$i"
done
[root@bogon tmp]# ./for_exam4.sh
1
2
3
4
[root@bogon tmp]#
計算1-4的和
[root@bogon tmp]# cat for_exam5.sh
#!/bin/bash
sum=0
for(( i=1;i<5;i++ ))
do
let "sum += i"
done
echo "sum=$sum"
[root@bogon tmp]# ./for_exam5.sh
sum=10
[root@bogon tmp]#
while
[root@bogon tmp]# cat while_exam.sh
#!/bin/bash
echo "please input a number:"
read num
while [[ "$num" != 4 ]]
do
if[ "$num" -lt 4 ]
then
echo" to small,input again "
readnum
elif [ "$num" -gt 4 ]
then
echo"to big , input again "
readnum
else
exit0
fi
done
echo "right"
[root@bogon tmp]#
[root@bogon tmp]# ./while_exam.sh
please input a number:
1
tosmall,input again
6
to big , input again
4
right
[root@bogon tmp]#
Break
#!/bin/bash
for(( i=1;i<5;i++ ))
do
echo"$i"
done
[root@bogon tmp]# ./break_exam.sh
sum=1
sum=3
sum=6
[root@bogon tmp]#
select
[root@bogon tmp]# cat select_exam.sh
#!/bin/bash
echo "what is your favriouscolor?"
select color in "red""blud" "green" "yellow"
do
break
done
echo "you have selectcolor:$color"
[root@bogon tmp]# ./select_exam.sh
what is your favrious color?
1) red
2) blud
3) green
4) yellow
#? 1
you have select color:red
[root@bogon tmp]#
I/O 重定向
cmd1 |cmd2 : pipe,將cmd1 的標準輸出作爲cmd2 的標準輸入
>file :將標準輸出重定向到file
<file :將file作爲標準輸入
>>file :將標準輸出重定向到file,如果file存在,append到文件中,即附加到文件的後面,而不是覆蓋文件
當cat不帶參數的時候,表示使用標準輸入作爲輸入,這允許在標準輸入中鍵入相關的內容,下面將alias加入.bashrc作爲最後一行
$ cat >> .bashrc
alias cdmnt='mount -t iso9660 /dev/sbpcd /cdrom'
^D
Ctrl+D退出
>|file :強制將標準輸出重定向到file,即使noclobber設置。當設置環境變量set–o noclobber,將禁止重定向到一個已經存在的文件中,避免文件被覆蓋。
n >|file :強制將文件描述符n重定向到file,即使noclobber打開
n>>file :將文件描述符n的輸出重定向到file,如果file存在,將輸出append到文件後面
n>& :將標準輸出複製到文件描述符n(Duplicatestandard output to file descriptor n)
n<& :從文件描述符n複製標準輸入(Duplicatestandard input from file descriptor n)
n>&m :文件描述字n將一個copy至文件描述字m(Filedescriptor n is made to be a copy of the output file descriptor)
n<&m :文件描述字n作爲文件描述字m中的一個拷貝(Filedescriptor n is made to be a copy of the input file descriptor)
&>file : 將標準輸出和標準錯誤輸出定向至文件file
<&- : 關閉標準輸入
>&- : 關閉標準輸出
n>&- : 關閉文件描述字作爲輸出(Close theoutput from file descriptor n)
n<&- :關閉文件描述字作輸入(Close theinput from file descriptor n)
文件描述符在bash中比較少用,從0開始用戶表示進行的數據流,0表示標準輸入,1表示標準輸出,2表示標註錯誤輸出,其他從3開始。最爲常用的場景是將錯誤消息輸出到某個文件,可以加上2>file 到我們的命令中。
我們來看下面一個腳本的例子:
command > logfile 2>&1 &
>logfile,表示command的標準輸出重定向至文件logfile中,2>&1,匹配n>&m,表示文件描述字2(command的標準錯誤輸出)將copy一份採用文件描述字1(即標準輸出),由於標準輸出已經重定向logfile,這份copy也見將重定向至文件lofgile。我們可以用“abcd > logfile 2>&1 &”來驗證這個效果。最後&表示後臺運行的方式。這樣命令表示在後臺運行command,而它的標準輸出和錯誤輸出均重定向到logfile文件中。下面可達到類似的效果:
command 2>&1 | tee logfile &
錯誤輸出同樣適用標準輸出,通過pipe方式,見他們作爲輸入執行tee logfile。tee命令將它的標準輸入copy至他的標準標準輸出以及參數所帶的文件中。和上面的命令不一眼這裏即會在stdout 和logfile中同時輸出。
其他文件描述字的重定向,例如<&n,通常用於從多個文件中讀入或者寫出。