注意:為了方便代碼閱讀,文章代碼塊里把表示管理員模式的#都去掉了。這不是錯誤。不要搞錯!!
一、基本操作命令
首先先來幾個熱鍵,非常方便,一定要記住
Tab按鍵—命令補齊功能
Ctrl+c按鍵—停掉正在運行的程序
Ctrl+d按鍵—相當于exit,退出
Ctrl+l按鍵—清屏
1.1 關機和重啟
1.關機命令:shutdown
在linux領域內大多用在服務器上,很少遇到關機的操作。畢竟服務器上跑一個服務是永無止境的,除非特殊情況下,不得已才會關機。
正確的關機流程為:sync > shutdown > reboot > halt
例如你可以運行如下命令關機:
sync 將數據由內存同步到硬盤中。shutdown 關機指令,你可以man shutdown 來看一下幫助文檔。例如你可以運行如下命令關機:shutdown –h 10 ‘This server will shutdown after 10 mins’ 這個命令告訴大家,計算機將在10分鐘后關機,并且會顯示在登陸用戶的當前屏幕中。shutdown –h now 立馬關機shutdown –h 20:25 系統會在今天20:25關機shutdown –h +10 十分鐘后關機shutdown –r now 系統立馬重啟shutdown –r +10 系統十分鐘后重啟reboot 就是重啟,等同于 shutdown –r nowhalt 關閉系統,等同于shutdown –h now 和 poweroff
登錄后復制
下面是一個簡單的樣例。
取消定時關機命令:shutdown -c
最后總結一下,不管是重啟系統還是關閉系統,首先要運行 sync 命令,把內存中的數據寫到磁盤中。
關機的命令有 shutdown –h now halt poweroff 和 init 0 , 重啟系統的命令有 shutdown –r now reboot init 6。
2.重啟命令:reboot
1.2 幫助命令
–-help命令
shutdown --help:ifconfig --help:查看網卡信息
登錄后復制
man命令(命令說明書)
man shutdown注意:man shutdown 打開命令說明書之后,使用按鍵q退出
登錄后復制
二、目錄操作命令
我們知道Linux的目錄結構為樹狀結構,最頂級的目錄為根目錄 /。
其他目錄通過掛載可以將它們添加到樹中,通過解除掛載可以移除它們。
首先我們需要先知道什么是絕對路徑與相對路徑。
-
絕對路徑:路徑的寫法,由根目錄 / 寫起,例如:/usr/share/doc 這個目錄。
-
相對路徑:路徑的寫法,不是由
/
寫起,例如由/usr/share/doc
要到/usr/share/man
底下時,可以寫成:cd ../man
這就是相對路徑的寫法啦!2.1 目錄切換 cd
命令:cd 目錄
cd是Change Directory的縮寫,這是用來變換工作目錄的命令。
cd / 切換到根目錄cd /usr 切換到根目錄下的usr目錄cd ../ 切換到上一級目錄 或者 cd ..cd ~ 切換到home目錄cd - 切換到上次訪問的目錄
登錄后復制
2.2 目錄查看 ls [-al]
命令:ls [-al]
語法:
ls [-aAdfFhilnrRSt] 目錄名稱ls [--color={never,auto,always}] 目錄名稱ls [--full-time] 目錄名稱
登錄后復制
ls 查看當前目錄下的所有目錄和文件ls -a 查看當前目錄下的所有目錄和文件(包括隱藏的文件)ls -l 或 ll 列表查看當前目錄下的所有目錄和文件(列表查看,顯示更多信息)ls /dir 查看指定目錄下的所有目錄和文件 如:ls /usr
將家目錄下的所有文件列出來(含屬性與隱藏檔)
ls -al ~
登錄后復制
2.3 目錄操作【增,刪,改,查】
2.3.1 創建目錄【增】 mkdir
如果想要創建新的目錄的話,那么就使用mkdir (make directory)吧。
語法:
mkdir [-mp] 目錄名稱
登錄后復制
選項與參數:
-
-m :配置文件的權限喔!直接配置,不需要看默認權限 (umask) 的臉色~
-
-p :幫助你直接將所需要的目錄(包含上一級目錄)遞歸創建起來!
實例:請到/tmp底下嘗試創建數個新目錄看看:
cd /tmp[root@www tmp] mkdir test <==創建一名為 test 的新目錄[root@www tmp] mkdir test1/test2/test3/test4mkdir: cannot create directory `test1/test2/test3/test4': No such file or directory <== 沒辦法直接創建此目錄啊![root@www tmp] mkdir -p test1/test2/test3/test4
登錄后復制
加了這個 -p 的選項,可以自行幫你創建多層目錄!
實例:創建權限為 rwx–x—x 的目錄。
[root@www tmp] mkdir -m 711 test2[root@www tmp] ls -ldrwxr-xr-x 3 root root 4096 Jul 18 12:50 testdrwxr-xr-x 3 root root 4096 Jul 18 12:53 test1drwx--x--x 2 root root 4096 Jul 18 12:54 test2
登錄后復制
上面的權限部分,如果沒有加上 -m 來強制配置屬性,系統會使用默認屬性。
如果我們使用 -m ,如上例我們給予 -m 711 來給予新的目錄 drwx–x—x 的權限。
2.3.2 刪除目錄或文件【刪】rm
rm [-fir] 文件或目錄
登錄后復制登錄后復制
選項與參數:
-
-f :就是 force 的意思,忽略不存在的文件,不會出現警告信息;
-
-i :互動模式,在刪除前會詢問使用者是否動作
-
-r :遞歸刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!
刪除文件:rm 文件 刪除當前目錄下的文件rm -f 文件 刪除當前目錄的的文件(不詢問)
刪除目錄:rm -r aaa 遞歸刪除當前目錄下的aaa目錄rm -rf aaa 遞歸刪除當前目錄下的aaa目錄(不詢問)
全部刪除:rm -rf 將當前目錄下的所有目錄和文件全部刪除rm -rf / 【慎用!慎用!慎用!】將根目錄下的所有文件全部刪除
注意:rm不僅可以刪除目錄,也可以刪除其他文件或壓縮包,為了方便大家的記憶,無論刪除任何目錄或文件,都直接使用 rm -rf 目錄/文件/壓縮包
rmdir (刪除空的目錄)
語法:
rmdir [-p] 目錄名稱
登錄后復制
選項與參數:
-
-p :連同上一級『空的』目錄也一起刪除
刪除 runoob 目錄
[root@www tmp] rmdir runoob
登錄后復制
將 mkdir 實例中創建的目錄(/tmp 底下)刪除掉!
[root@www tmp] ls -l <==看看有多少目錄存在?drwxr-xr-x 3 root root 4096 Jul 18 12:50 testdrwxr-xr-x 3 root root 4096 Jul 18 12:53 test1drwx--x--x 2 root root 4096 Jul 18 12:54 test2[root@www tmp] rmdir test <==可直接刪除掉,沒問題[root@www tmp] rmdir test1 <==因為尚有內容,所以無法刪除!rmdir: `test1': Directory not empty[root@www tmp] rmdir -p test1/test2/test3/test4[root@www tmp] ls -l <==您看看,底下的輸出中test與test1不見了!drwx--x--x 2 root root 4096 Jul 18 12:54 test2
登錄后復制
利用 -p 這個選項,立刻就可以將 test1/test2/test3/test4 一次刪除。
不過要注意的是,這個 rmdir 僅能刪除空的目錄,你可以使用 rm 命令來刪除非空目錄。
2.3.3 目錄修改【改】mv 和 cp
mv (移動文件與目錄,或修改名稱)
語法:
[root@www ~] mv [-fiu] source destination[root@www ~] mv [options] source1 source2 source3 .... directory
登錄后復制
選項與參數:
-
-f :force 強制的意思,如果目標文件已經存在,不會詢問而直接覆蓋;
-
-i :若目標文件 (destination) 已經存在時,就會詢問是否覆蓋!
-
-u :若目標文件已經存在,且 source 比較新,才會升級 (update)
cp (復制文件或目錄)
cp 即拷貝文件和目錄。
語法:
[root@www ~] cp [-adfilprsu] 來源檔(source) 目標檔(destination)[root@www ~] cp [options] source1 source2 source3 .... directory
登錄后復制
選項與參數:
-
-a:相當於 -pdr 的意思,至於 pdr 請參考下列說明;(常用)
-
-d:若來源檔為連結檔的屬性(link file),則復制連結檔屬性而非文件本身;
-
-f:為強制(force)的意思,若目標文件已經存在且無法開啟,則移除后再嘗試一次;
-
-i:若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
-
-l:進行硬式連結(hard link)的連結檔創建,而非復制文件本身;
-
-p:連同文件的屬性一起復制過去,而非使用默認屬性(備份常用);
-
-r:遞歸持續復制,用於目錄的復制行為;(常用)
-
-s:復制成為符號連結檔 (symbolic link),亦即『捷徑』文件;
-
-u:若 destination 比 source 舊才升級 destination !
一、重命名目錄命令:mv 當前目錄 新目錄例如:mv aaa bbb 將目錄aaa改為bbb注意:mv的語法不僅可以對目錄進行重命名而且也可以對各種文件,壓縮包等進行 重命名的操作
二、剪切目錄命令:mv 目錄名稱 目錄的新位置示例:將/usr/tmp目錄下的aaa目錄剪切到 /usr目錄下面 mv /usr/tmp/aaa /usr注意:mv語法不僅可以對目錄進行剪切操作,對文件和壓縮包等都可執行剪切操作
三、拷貝目錄命令:cp -r 目錄名稱 目錄拷貝的目標位置 -r代表遞歸示例:將/usr/tmp目錄下的aaa目錄復制到 /usr目錄下面 cp /usr/tmp/aaa /usr注意:cp命令不僅可以拷貝目錄還可以拷貝文件,壓縮包等,拷貝文件和壓縮包時不 用寫-r遞歸
2.3.4 搜索目錄【查】find
Linux find 命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則 find 命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。
find path -option [ -print ] [ -exec -ok command ] {} \;
登錄后復制
命令:find 目錄 參數 文件名稱
部分參數:
find 根據下列規則判斷 path 和 expression,在命令列上第一個 – ( ) , ! 之前的部份為 path,之后的是 expression。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 為預設 expression。
expression 中可使用的選項有二三十個之多,在此只介紹最常用的部份。
-mount, -xdev : 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件
-amin n : 在過去 n 分鐘內被讀取過
-anewer file : 比文件 file 更晚被讀取過的文件
-atime n : 在過去n天內被讀取過的文件
-cmin n : 在過去 n 分鐘內被修改過
-cnewer file :比文件 file 更新的文件
-ctime n : 在過去n天內被修改過的文件
實例
將目前目錄及其子目錄下所有延伸檔名是 c 的文件列出來。
find . -name "*.c"
登錄后復制
將目前目錄其其下子目錄中所有一般文件列出
find . -type f
登錄后復制
將目前目錄及其子目錄下所有最近 20 天內更新過的文件列出
find . -ctime -20
登錄后復制
2.4 當前目錄顯示 pwd
pwd (顯示目前所在的目錄)
pwd 是 Print Working Directory 的縮寫,也就是顯示目前所在目錄的命令。
[root@www ~] pwd [-P]
登錄后復制
選項與參數:
-
-P :顯示出確實的路徑,而非使用連結 (link) 路徑。
實例:單純顯示出目前的工作目錄:
[root@www ~] pwd/root <== 顯示出目錄啦~
登錄后復制
實例顯示出實際的工作目錄,而非連結檔本身的目錄名而已。
[root@www ~] cd /var/mail <==注意,/var/mail是一個連結檔[root@www mail] pwd/var/mail <==列出目前的工作目錄[root@www mail] pwd -P/var/spool/mail <==怎么回事?有沒有加 -P 差很多~[root@www mail] ls -ld /var/maillrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail# 看到這里應該知道為啥了吧?因為 /var/mail 是連結檔,連結到 /var/spool/mail # 所以,加上 pwd -P 的選項后,會不以連結檔的數據顯示,而是顯示正確的完整路徑啊!
登錄后復制
三、文件操作命令
3.1 文件操作【增,刪,改,查】
3.1.1 新建文件【增】touch
Linux touch命令用于修改文件或者目錄的時間屬性,包括存取時間和更改時間。若文件不存在,系統會建立一個新的文件。
ls -l 可以顯示檔案的時間記錄。
語法
touch [-acfm][-d<日期時間>][-r<參考文件或目錄>] [-t<日期時間>][--help][--version][文件或目錄…]
登錄后復制
-
參數說明:
-
a 改變檔案的讀取時間記錄。
-
m 改變檔案的修改時間記錄。
-
c 假如目的檔案不存在,不會建立新的檔案。與 —no-create 的效果一樣。
-
f 不使用,是為了與其他 unix 系統的相容性而保留。
-
r 使用參考檔的時間記錄,與 —file 的效果一樣。
-
d 設定時間與日期,可以使用各種不同的格式。
-
t 設定檔案的時間記錄,格式與 date 指令相同。
-
–no-create 不會建立新檔案。
-
–help 列出指令格式。
-
–version 列出版本訊息。
實例
使用指令”touch”修改文件”testfile”的時間屬性為當前系統時間,輸入如下命令:
$ touch testfile #修改文件的時間屬性
登錄后復制
首先,使用ls命令查看testfile文件的屬性,如下所示:
$ ls -l testfile #查看文件的時間屬性 #原來文件的修改時間為16:09 -rw-r--r-- 1 hdd hdd 55 2011-08-22 16:09 testfile
登錄后復制
執行指令”touch”修改文件屬性以后,并再次查看該文件的時間屬性,如下所示:
$ touch testfile #修改文件時間屬性為當前系統時間 $ ls -l testfile #查看文件的時間屬性 #修改后文件的時間屬性為當前系統時間 -rw-r--r-- 1 hdd hdd 55 2011-08-22 19:53 testfile
登錄后復制
使用指令”touch”時,如果指定的文件不存在,則將創建一個新的空白文件。例如,在當前目錄下,使用該指令創建一個空白文件”file”,輸入如下命令:
$ touch file #創建一個名為“file”的新的空白文件
登錄后復制
3.1.2 刪除文件 【刪】 rm
rm (移除文件或目錄)
語法:
rm [-fir] 文件或目錄
登錄后復制登錄后復制
選項與參數:
-
-f :就是 force 的意思,忽略不存在的文件,不會出現警告信息;
-
-i :互動模式,在刪除前會詢問使用者是否動作
-
-r :遞歸刪除啊!最常用在目錄的刪除了!這是非常危險的選項!!!
將創建的 bashrc 刪除掉!
[root@www tmp]# rm -i bashrcrm: remove regular file `bashrc'? y
登錄后復制
如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!
3.1.3 修改文件【改】 vi或vim
先來個vim鍵盤圖!
vi/vim 的使用
基本上 vi/vim 共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和 底線命令模式(Last line mode)。這三種模式的作用分別是:
3.1.3.1 命令模式:
用戶剛剛啟動 vi/vim,便進入了命令模式。
此狀態下敲擊鍵盤動作會被Vim識別為命令,而非輸入字符。比如我們此時按下i,并不會輸入一個字符,i被當作了一個命令。
以下是常用的幾個命令:
-
i 切換到輸入模式,以輸入字符。
-
x 刪除當前光標所在處的字符。
-
: 切換到底線命令模式,以在最底一行輸入命令。
若想要編輯文本:啟動Vim,進入了命令模式,按下i,切換到輸入模式。
命令模式只有一些最基本的命令,因此仍要依靠底線命令模式輸入更多命令。
3.1.3.2 輸入模式
在命令模式下按下i就進入了輸入模式。
在輸入模式中,可以使用以下按鍵:
-
字符按鍵以及Shift組合,輸入字符
-
ENTER,回車鍵,換行
-
BACK SPACE,退格鍵,刪除光標前一個字符
-
DEL,刪除鍵,刪除光標后一個字符
-
方向鍵,在文本中移動光標
-
HOME/END,移動光標到行首/行尾
-
Page Up/Page Down,上/下翻頁
-
Insert,切換光標為輸入/替換模式,光標將變成豎線/下劃線
-
ESC,退出輸入模式,切換到命令模式
3.1.3.4 底線命令模式
在命令模式下按下:(英文冒號)就進入了底線命令模式。
底線命令模式可以輸入單個或多個字符的命令,可用的命令非常多。
在底線命令模式中,基本的命令有(已經省略了冒號):
-
q 退出程序
-
w 保存文件
按ESC鍵可隨時退出底線命令模式。
簡單的說,我們可以將這三個模式想成底下的圖標來表示:
打開文件
命令:vi 文件名示例:打開當前目錄下的aa.txt文件 vi aa.txt 或者 vim aa.txt
注意:使用vi編輯器打開文件后,并不能編輯,因為此時處于命令模式,點擊鍵盤i/a/o進入編輯模式。
編輯文件
使用vi編輯器打開文件后點擊按鍵:i ,a或者o即可進入編輯模式。
i:在光標所在字符前開始插入a:在光標所在字符后開始插入o:在光標所在行的下面另起一新行插入
保存或者取消編輯
保存文件:
第一步:ESC 進入命令行模式第二步:: 進入底行模式第三步:wq 保存并退出編輯
取消編輯:
第一步:ESC 進入命令行模式第二步:: 進入底行模式第三步:q! 撤銷本次修改并退出編輯
3.1.4 文件的查看【查】
Linux系統中使用以下命令來查看文件的內容:
-
cat 由第一行開始顯示文件內容
-
tac 從最后一行開始顯示,可以看出 tac 是 cat 的倒著寫!
-
nl 顯示的時候,順道輸出行號!
-
more 一頁一頁的顯示文件內容
-
less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
-
head 只看頭幾行
-
tail 只看尾巴幾行
你可以使用 man [命令]來查看各個命令的使用文檔,如 :man cp。
3.1.4.1 cat
由第一行開始顯示文件內容
語法:
cat [-AbEnTv]
登錄后復制
選項與參數:
-
-A :相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已;
-
-b :列出行號,僅針對非空白行做行號顯示,空白行不標行號!
-
-E :將結尾的斷行字節 $ 顯示出來;
-
-n :列印出行號,連同空白行也會有行號,與 -b 的選項不同;
-
-T :將 [tab] 按鍵以 ^I 顯示出來;
-
-v :列出一些看不出來的特殊字符
檢看 /etc/issue 這個文件的內容:
[root@www ~] cat /etc/issueCentOS release 6.4 (Final)Kernel \r on an \m
登錄后復制
3.1.3.2 tac
tac與cat命令剛好相反,文件內容從最后一行開始顯示,可以看出 tac 是 cat 的倒著寫!如:
[root@www ~] tac /etc/issueKernel \r on an \mCentOS release 6.4 (Final)
登錄后復制
3.1.3.3 nl
顯示行號
語法:
nl [-bnw] 文件
登錄后復制
選項與參數:
-
-b :指定行號指定的方式,主要有兩種:-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);-b t :如果有空行,空的那一行不要列出行號(默認值);
-
-n :列出行號表示的方法,主要有三種:-n ln :行號在熒幕的最左方顯示;-n rn :行號在自己欄位的最右方顯示,且不加 0 ;-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-
-w :行號欄位的占用的位數。
實例一:用 nl 列出 /etc/issue 的內容
牛逼啊!接私活必備的 N 個開源項目!趕快收藏吧
登錄后復制
[root@www ~] nl /etc/issue 1 CentOS release 6.4 (Final) 2 Kernel \r on an \m123
登錄后復制
3.1.3.5 more
一頁一頁翻動
[root@www ~] more /etc/man_db.config ## Generated automatically from man.conf.in by the# configure script.## man.conf from man-1.6d....(中間省略)....--More--(28%) <== 重點在這一行喔!你的光標也會在這里等待你的命令
登錄后復制
在 more 這個程序的運行過程中,你有幾個按鍵可以按的:
-
空白鍵 (space):代表向下翻一頁;
-
Enter :代表向下翻『一行』;
-
/字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
-
:f :立刻顯示出檔名以及目前顯示的行數;
-
q :代表立刻離開 more ,不再顯示該文件內容。
-
b 或 [ctrl]-b :代表往回翻頁,不過這動作只對文件有用,對管線無用。
3.1.3.6 less
一頁一頁翻動,以下實例輸出/etc/man.config文件的內容:
[root@www ~] less /etc/man.config## Generated automatically from man.conf.in by the# configure script.## man.conf from man-1.6d....(中間省略)....: <== 這里可以等待你輸入命令!
登錄后復制
less運行時可以輸入的命令有:
-
空白鍵 :向下翻動一頁;
-
[pagedown]:向下翻動一頁;
-
[pageup] :向上翻動一頁;
-
/字串 :向下搜尋『字串』的功能;
-
?字串 :向上搜尋『字串』的功能;
-
n :重復前一個搜尋 (與 / 或 ? 有關!)
-
N :反向的重復前一個搜尋 (與 / 或 ? 有關!)
-
q :離開 less 這個程序;
3.1.3.7 head
取出文件前面幾行
語法:
head [-n number] 文件
登錄后復制
選項與參數:
-
-n :后面接數字,代表顯示幾行的意思
[root@www ~] head /etc/man.config
登錄后復制
默認的情況中,顯示前面 10 行!若要顯示前 20 行,就得要這樣:
[root@www ~] head -n 20 /etc/man.config
登錄后復制
3.1.3.8 tail
取出文件后面幾行
語法:
tail [-n number] 文件
登錄后復制
選項與參數:
-
-n :后面接數字,代表顯示幾行的意思
-
-f :表示持續偵測后面所接的檔名,要等到按下[ctrl]-c才會結束tail的偵測
[root@www ~] tail /etc/man.config# 默認的情況中,顯示最后的十行!若要顯示最后的 20 行,就得要這樣:[root@www ~] tail -n 20 /etc/man.config
登錄后復制
3.2 權限修改
Linux/Unix 的文件調用權限分為三級 : 文件擁有者、群組、其他。利用 chmod 可以藉以控制文件如何被他人所調用。
使用權限 : 所有使用者
語法
chmod [-cfvR] [--help] [--version] mode file...
登錄后復制
參數說明
mode : 權限設定字串,格式如下 :
[ugoa...][[+-=][rwxX]...][,...]
登錄后復制
其中:
-
u 表示該文件的擁有者,g 表示與該文件的擁有者屬于同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。
-
+ 表示增加權限、- 表示取消權限、= 表示唯一設定權限。
-
r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該文件是個子目錄或者該文件已經被設定過為可執行。
其他參數說明:
-
-c : 若該文件權限確實已經更改,才顯示其更改動作
-
-f : 若該文件權限無法被更改也不要顯示錯誤訊息
-
-v : 顯示權限變更的詳細資料
-
-R : 對目前目錄下的所有文件與子目錄進行相同的權限變更(即以遞回的方式逐個變更)
-
–help : 顯示輔助說明
-
–version : 顯示版本
權限的設定方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。
數字類型改變檔案權限:
符號類型改變檔案權限:
四、壓縮文件操作
Linux 常用的壓縮與解壓縮命令有:tar、gzip、gunzip、bzip2、bunzip2、compress 、uncompress、 zip、 unzip、rar、unrar 等。
4.1 打包和壓縮和解壓
Windows的壓縮文件的擴展名 .zip/.rarlinux中的打包文件:aa.tarlinux中的壓縮文件:bb.gzlinux中打包并壓縮的文件:.tar.gz
Linux中的打包文件一般是以.tar結尾的,壓縮的命令一般是以.gz結尾的。而一般情況下打包和壓縮是一起進行的,打包并壓縮后的文件的后綴名一般.tar.gz。
4.1.1 tar
最常用的打包命令是 tar,使用 tar 程序打出來的包我們常稱為 tar 包,tar 包文件的命令通常都是以 .tar 結尾的。生成 tar 包后,就可以用其它的程序來進行壓縮了,所以首先就來講講 tar 命令的基本用法。
tar 命令的選項有很多(用 man tar 可以查看到),但常用的就那么幾個選項,下面來舉例說明一下:
tar -cf all.tar *.jpg
登錄后復制
這條命令是將所有 .jpg 的文件打成一個名為 all.tar 的包。-c 是表示產生新的包,-f 指定包的文件名。
tar -rf all.tar *.gif
登錄后復制登錄后復制
這條命令是將所有 .gif 的文件增加到 all.tar 的包里面去,-r 是表示增加文件的意思。
tar -uf all.tar logo.gif
登錄后復制登錄后復制
這條命令是更新原來 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思。
tar -tf all.tar
登錄后復制登錄后復制
這條命令是列出 all.tar 包中所有文件,-t 是列出文件的意思。
tar -xf all.tar
登錄后復制登錄后復制
這條命令是解出 all.tar 包中所有文件,-x 是解開的意思。
以上就是 tar 的最基本的用法。為了方便用戶在打包解包的同時可以壓縮或解壓文件,tar 提供了一種特殊的功能。這就是 tar 可以在打包或解包的同時調用其它的壓縮程序,比如調用 gzip、bzip2 等。
4.1.1.1 tar調用
gzip 是 GNU 組織開發的一個壓縮程序,.gz 結尾的文件就是 gzip 壓縮的結果。與 gzip 相對的解壓程序是 gunzip。tar 中使用 -z 這個參數來調用gzip。下面來舉例說明一下:
tar -czf all.tar.gz *.jpg
登錄后復制
這條命令是將所有 .jpg 的文件打成一個 tar 包,并且將其用 gzip 壓縮,生成一個 gzip 壓縮過的包,包名為 all.tar.gz。
tar -xzf all.tar.gz
登錄后復制
這條命令是將上面產生的包解開。
4.1.1.2 tar 調用 bzip2
bzip2 是一個壓縮能力更強的壓縮程序,.bz2 結尾的文件就是 bzip2 壓縮的結果。
與 bzip2 相對的解壓程序是 bunzip2。tar 中使用 -j 這個參數來調用 gzip。下面來舉例說明一下:
tar -cjf all.tar.bz2 *.jpg
登錄后復制
這條命令是將所有 .jpg 的文件打成一個 tar 包,并且將其用 bzip2 壓縮,生成一個 bzip2 壓縮過的包,包名為 all.tar.bz2
tar -xjf all.tar.bz2
登錄后復制
這條命令是將上面產生的包解開。
4.1.1.3 tar 調用 compress
compress 也是一個壓縮程序,但是好象使用 compress 的人不如 gzip 和 bzip2 的人多。.Z 結尾的文件就是 bzip2 壓縮的結果。與 compress 相對的解壓程序是 uncompress。tar 中使用 -Z 這個參數來調用 compress。下面來舉例說明一下:
tar -cZf all.tar.Z *.jpg
登錄后復制
這條命令是將所有 .jpg 的文件打成一個 tar 包,并且將其用 compress 壓縮,生成一個 uncompress 壓縮過的包,包名為 all.tar.Z。
tar -xZf all.tar.Z
登錄后復制
這條命令是將上面產生的包解開。
有了上面的知識,你應該可以解開多種壓縮文件了,下面對于 tar 系列的壓縮文件作一個小結:
1) 對于.tar結尾的文件
tar -xf all.tar
登錄后復制
2) 對于 .gz 結尾的文件
gzip -d all.gzgunzip all.gz
登錄后復制
3)對于 .tgz 或 .tar.gz 結尾的文件
tar -xzf all.tar.gztar -xzf all.tgz
登錄后復制
4) 對于 .bz2 結尾的文件
bzip2 -d all.bz2bunzip2 all.bz2
登錄后復制
5) 對于 tar.bz2 結尾的文件
tar -xjf all.tar.bz2
登錄后復制
6) 對于 .Z 結尾的文件
uncompress all.Z
登錄后復制
7) 對于 .tar.Z 結尾的文件
tar -xZf all.tar.z
登錄后復制
另外對于 Windows 下的常見壓縮文件 .zip 和 .rar,Linux 也有相應的方法來解壓它們:
1) 對于 .zip
linux 下提供了 zip 和 unzip 程序,zip 是壓縮程序,unzip 是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
zip all.zip *.jpg
登錄后復制
這條命令是將所有 .jpg 的文件壓縮成一個 zip 包:
unzip all.zip
登錄后復制
這條命令是將 all.zip 中的所有文件解壓出來。
2) 對于 .rar
要在 linux 下處理 .rar 文件,需要安裝 RAR for Linux。下載地址:http://www.rarsoft.com/download.htm,下載后安裝即可。
tar -xzpvf rarlinux-x64-5.6.b5.tar.gz cd rar make
登錄后復制
這樣就安裝好了,安裝后就有了 rar 和 unrar 這兩個程序,rar 是壓縮程序,unrar 是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
rar a all *.jpg
登錄后復制
這條命令是將所有 .jpg 的文件壓縮成一個 rar 包,名為 all.rar,該程序會將 .rar 擴展名將自動附加到包名后。
unrar e all.rar
登錄后復制
這條命令是將 all.rar 中的所有文件解壓出來
4.2 擴展內容
tar
-c: 建立壓縮檔案 -x:解壓 -t:查看內容 shell-r:向壓縮歸檔文件末尾追加文件 -u:更新原壓縮包中的文件
登錄后復制
這五個是獨立的命令,壓縮解壓都要用到其中一個,可以和別的命令連用但只能用其中一個。下面的參數是根據需要在壓縮或解壓檔案時可選的。
-z:有gzip屬性的 -j:有bz2屬性的 -Z:有compress屬性的 -v:顯示所有過程 -O:將文件解開到標準輸出
登錄后復制
下面的參數 -f 是必須的:
-f: 使用檔案名字,切記,這個參數是最后一個參數,后面只能接檔案名。
登錄后復制
# tar -cf all.tar *.jpg
這條命令是將所有 .jpg 的文件打成一個名為 all.tar 的包。-c 是表示產生新的包,-f 指定包的文件名。
tar -rf all.tar *.gif
登錄后復制登錄后復制
這條命令是將所有 .gif 的文件增加到 all.tar 的包里面去。-r 是表示增加文件的意思。
tar -uf all.tar logo.gif
登錄后復制登錄后復制
這條命令是更新原來 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思。
tar -tf all.tar
登錄后復制登錄后復制
這條命令是列出 all.tar 包中所有文件,-t 是列出文件的意思。
tar -xf all.tar
登錄后復制登錄后復制
這條命令是解出 all.tar 包中所有文件,-x 是解開的意思。
壓縮
tar –cvf jpg.tar *.jpg // 將目錄里所有jpg文件打包成 tar.jpg tar –czf jpg.tar.gz *.jpg // 將目錄里所有jpg文件打包成 jpg.tar 后,并且將其用 gzip 壓縮,生成一個 gzip 壓縮過的包,命名為 jpg.tar.gz tar –cjf jpg.tar.bz2 *.jpg // 將目錄里所有jpg文件打包成 jpg.tar 后,并且將其用 bzip2 壓縮,生成一個 bzip2 壓縮過的包,命名為jpg.tar.bz2 tar –cZf jpg.tar.Z *.jpg // 將目錄里所有 jpg 文件打包成 jpg.tar 后,并且將其用 compress 壓縮,生成一個 umcompress 壓縮過的包,命名為jpg.tar.Z rar a jpg.rar *.jpg // rar格式的壓縮,需要先下載 rar for linux zip jpg.zip *.jpg // zip格式的壓縮,需要先下載 zip for linux
登錄后復制
解壓
tar –xvf file.tar // 解壓 tar 包 tar -xzvf file.tar.gz // 解壓 tar.gz tar -xjvf file.tar.bz2 // 解壓 tar.bz2 tar –xZvf file.tar.Z // 解壓 tar.Z unrar e file.rar // 解壓 rar unzip file.zip // 解壓 zip
登錄后復制
總結
1、*.tar 用 tar –xvf 解壓 2、*.gz 用 gzip -d或者gunzip 解壓 3、*.tar.gz和*.tgz 用 tar –xzf 解壓 4、*.bz2 用 bzip2 -d或者用bunzip2 解壓 5、*.tar.bz2用tar –xjf 解壓 6、*.Z 用 uncompress 解壓 7、*.tar.Z 用tar –xZf 解壓 8、*.rar 用 unrar e解壓 9、*.zip 用 unzip 解壓
登錄后復制
五、查找命令
5.1 grep
grep命令是一種強大的文本搜索工具
使用實例:
ps -ef | grep sshd 查找指定ssh服務進程 ps -ef | grep sshd | grep -v grep 查找指定服務進程,排除gerp身 ps -ef | grep sshd -c 查找指定進程個數
登錄后復制
從文件內容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
登錄后復制
例子:在當前目錄里第一級文件夾中尋找包含指定字符串的 .in 文件
grep "thermcontact" /.in
登錄后復制
從文件內容查找與正則表達式匹配的行:
$ grep –e "正則表達式" 文件名
登錄后復制
查找時不區分大小寫:
$ grep –i "被查找的字符串" 文件名
登錄后復制
查找匹配的行數:
$ grep -c “被查找的字符串” 文件名
從文件內容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
登錄后復制
5.2 find
find命令在目錄結構中搜索文件,并對搜索結果執行指定的操作。
find 默認搜索當前目錄及其子目錄,并且不過濾任何結果(也就是返回所有文件),將它們全都顯示在屏幕上。另外,搜索公眾號編程技術圈后臺回復“1024”,獲取一份驚喜禮包。
使用實例:
find . -name "*.log" -ls 在當前目錄查找以.log結尾的文件,并顯示詳細信息。find /root/ -perm 600 查找/root/目錄下權限為600的文件 find . -type f -name "*.log" 查找當目錄,以.log結尾的普通文件 find . -type d | sort 查找當前所有目錄并排序 find . -size +100M 查找當前目錄大于100M的文件
登錄后復制
從根目錄開始查找所有擴展名為 .log 的文本文件,并找出包含 “ERROR” 的行:
$ find / -type f -name "*.log" | xargs grep "ERROR"
登錄后復制
例子:從當前目錄開始查找所有擴展名為 .in 的文本文件,并找出包含 “thermcontact” 的行:
find . -name "*.in" | xargs grep "thermcontact"
登錄后復制
5.3 locate
locate 讓使用者可以很快速的搜尋某個路徑。默認每天自動更新一次,所以使用locate 命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。如果數據庫中沒有查詢的數據,則會報出locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory該錯誤!updatedb即可!
yum -y install mlocate 如果是精簡版CentOS系統需要安裝locate命令
使用實例:
updatedblocate /etc/sh 搜索etc目錄下所有以sh開頭的文件 locate pwd 查找和pwd相關的所有文件
登錄后復制
5.4 whereis
whereis命令是定位可執行文件、源代碼文件、幫助文件在文件系統中的位置。這些文件的屬性應屬于原始代碼,二進制文件,或是幫助文件。
使用實例:
whereis ls 將和ls文件相關的文件都查找出來
登錄后復制
5.5 which
which命令的作用是在PATH變量指定的路徑中,搜索某個系統命令的位置,并且返回第一個搜索結果。
使用實例:
which pwd 查找pwd命令所在路徑 which java 查找path中java的路徑
登錄后復制
六、su、sudo
6.1 su
Linux su命令用于變更為其他使用者的身份,除 root 外,需要鍵入該使用者的密碼。
使用權限:所有使用者。
語法
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
登錄后復制
參數說明:
-
-f 或 —fast 不必讀啟動檔(如 csh.cshrc 等),僅用于 csh 或 tcsh
-
-m -p 或 —preserve-environment 執行 su 時不改變環境變數
-
-c command 或 —command=command 變更為帳號為 USER 的使用者并執行指令(command)后再變回原來使用者
-
-s shell 或 —shell=shell 指定要執行的 shell (bash csh tcsh 等),預設值為 /etc/passwd 內的該使用者(USER) shell
-
–help 顯示說明文件
-
–version 顯示版本資訊
-
– -l 或 —login 這個參數加了之后,就好像是重新 login 為該使用者一樣,大部份環境變數(HOME SHELL USER等等)都是以該使用者(USER)為主,并且工作目錄也會改變,如果沒有指定 USER ,內定是 root
-
USER 欲變更的使用者帳號
-
ARG 傳入新的 shell 參數
實例
變更帳號為 root 并在執行 ls 指令后退出變回原使用者
su -c ls root
登錄后復制
變更帳號為 root 并傳入 -f 參數給新執行的 shell
su root -f
登錄后復制登錄后復制
變更帳號為 clsung 并改變工作目錄至 clsung 的家目錄(home dir)
su - clsung
登錄后復制登錄后復制
切換用戶
hnlinux@runoob.com:~$ whoami //顯示當前用戶hnlinuxhnlinux@runoob.com:~$ pwd //顯示當前目錄/home/hnlinuxhnlinux@runoob.com:~$ su root //切換到root用戶密碼:root@runoob.com:/home/hnlinux# whoami rootroot@runoob.com:/home/hnlinux# pwd/home/hnlinux
登錄后復制登錄后復制
切換用戶,改變環境變量
hnlinux@runoob.com:~$ whoami //顯示當前用戶hnlinuxhnlinux@runoob.com:~$ pwd //顯示當前目錄/home/hnlinuxhnlinux@runoob.com:~$ su - root //切換到root用戶密碼:root@runoob.com:/home/hnlinux# whoami rootroot@runoob.com:/home/hnlinux# pwd //顯示當前目錄/root
登錄后復制登錄后復制
su用于用戶之間的切換。但是切換前的用戶依然保持登錄狀態。如果是root 向普通或虛擬用戶切換不需要密碼,反之普通用戶切換到其它任何用戶都需要密碼驗證。
su test:切換到test用戶,但是路徑還是/root目錄su - test : 切換到test用戶,路徑變成了/home/testsu : 切換到root用戶,但是路徑還是原來的路徑su - : 切換到root用戶,并且路徑是/rootsu不足:如果某個用戶需要使用root權限、則必須要把root密碼告訴此用戶。退出返回之前的用戶:exit
登錄后復制登錄后復制
6.2 sudo
sudo是為所有想使用root權限的普通用戶設計的。可以讓普通用戶具有臨時使用root權限的權利。只需輸入自己賬戶的密碼即可。
進入sudo配置文件命令:
vi /etc/sudoer或者visudo
登錄后復制
案例:允許hadoop用戶以root身份執行各種應用命令,需要輸入hadoop用戶的密碼。hadoop ALL=(ALL) ALL
案例:只允許hadoop用戶以root身份執行ls 、cat命令,并且執行時候免輸入密碼。配置文件中:hadoop ALL=NOPASSWD: /bin/ls, /bin/cat
su root -f
登錄后復制登錄后復制
變更帳號為 clsung 并改變工作目錄至 clsung 的家目錄(home dir)
su - clsung
登錄后復制登錄后復制
切換用戶
hnlinux@runoob.com:~$ whoami //顯示當前用戶hnlinuxhnlinux@runoob.com:~$ pwd //顯示當前目錄/home/hnlinuxhnlinux@runoob.com:~$ su root //切換到root用戶密碼:root@runoob.com:/home/hnlinux# whoami rootroot@runoob.com:/home/hnlinux# pwd/home/hnlinux
登錄后復制登錄后復制
切換用戶,改變環境變量
hnlinux@runoob.com:~$ whoami //顯示當前用戶hnlinuxhnlinux@runoob.com:~$ pwd //顯示當前目錄/home/hnlinuxhnlinux@runoob.com:~$ su - root //切換到root用戶密碼:root@runoob.com:/home/hnlinux# whoami rootroot@runoob.com:/home/hnlinux# pwd //顯示當前目錄/root
登錄后復制登錄后復制
su用于用戶之間的切換。但是切換前的用戶依然保持登錄狀態。如果是root 向普通或虛擬用戶切換不需要密碼,反之普通用戶切換到其它任何用戶都需要密碼驗證。
su test:切換到test用戶,但是路徑還是/root目錄su - test : 切換到test用戶,路徑變成了/home/testsu : 切換到root用戶,但是路徑還是原來的路徑su - : 切換到root用戶,并且路徑是/rootsu不足:如果某個用戶需要使用root權限、則必須要把root密碼告訴此用戶。退出返回之前的用戶:exit
登錄后復制登錄后復制
七、下載與安裝 yum
yum( Yellow dog Updater, Modified)是一個在Fedora和RedHat以及SUSE中的Shell前端軟件包管理器。
基於RPM包管理,能夠從指定的服務器自動下載RPM包并且安裝,可以自動處理依賴性關系,并且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
yum提供了查找、安裝、刪除某一個、一組甚至全部軟件包的命令,而且命令簡潔而又好記。
7.1 yum 語法
yum [options] [command] [package ...]
登錄后復制
-
options:可選,選項包括-h(幫助),-y(當安裝過程提示選擇全部為”yes”),-q(不顯示安裝的過程)等等。
-
command:要進行的操作。
-
package操作的對象。
7.2 yum常用命令
-
1.列出所有可更新的軟件清單命令:yum check-update
-
2.更新所有軟件命令:yum update
-
3.僅安裝指定的軟件命令:yum install
-
4.僅更新指定的軟件命令:yum update
-
5.列出所有可安裝的軟件清單命令:yum list
-
6.刪除軟件包命令:yum remove
-
7.查找軟件包 命令:yum search
-
8.清除緩存命令:
-
yum clean packages: 清除緩存目錄下的軟件包
-
yum clean headers: 清除緩存目錄下的 headers
-
yum clean oldheaders: 清除緩存目錄下舊的 headers
-
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除緩存目錄下的軟件包及舊的headers
實例 1
安裝 pam-devel
[root@www ~] yum install pam-develSetting up Install ProcessParsing package install argumentsResolving Dependencies <==先檢查軟件的屬性相依問題--> Running transaction check---> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be updated--> Processing Dependency: pam = 0.99.6.2-4.el5 for package: pam-devel--> Running transaction check---> Package pam.i386 0:0.99.6.2-4.el5 set to be updatedfilelists.xml.gz 100% |=========================| 1.6 MB 00:05filelists.xml.gz 100% |=========================| 138 kB 00:00-> Finished Dependency Resolution……(省略)
登錄后復制
實例 2
移除 pam-devel
[root@www ~] yum remove pam-develSetting up Remove ProcessResolving Dependencies <==同樣的,先解決屬性相依的問題--> Running transaction check---> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be erased--> Finished Dependency ResolutionDependencies Resolved============================================================================= Package Arch Version Repository Size=============================================================================Removing: pam-devel i386 0.99.6.2-4.el5 installed 495 kTransaction Summary=============================================================================Install 0 Package(s)Update 0 Package(s)Remove 1 Package(s) <==還好,并沒有屬性相依的問題,單純移除一個軟件Is this ok [y/N]: yDownloading Packages:Running rpm_check_debugRunning Transaction TestFinished Transaction TestTransaction Test SucceededRunning Transaction Erasing : pam-devel ######################### [1/1]Removed: pam-devel.i386 0:0.99.6.2-4.el5Complete!
登錄后復制
實例 3
利用 yum 的功能,找出以 pam 為開頭的軟件名稱有哪些?
[root@www ~] yum list pam*Installed Packagespam.i386 0.99.6.2-3.27.el5 installedpam_ccreds.i386 3-5 installedpam_krb5.i386 2.2.14-1 installedpam_passwdqc.i386 1.0.2-1.2.2 installedpam_pkcs11.i386 0.5.3-23 installedpam_smb.i386 1.1.7-7.2.1 installedAvailable Packages <==底下則是『可升級』的或『未安裝』的pam.i386 0.99.6.2-4.el5 basepam-devel.i386 0.99.6.2-4.el5 basepam_krb5.i386 2.2.14-10 base
登錄后復制
7.3 國內 yum 源
網易(163)yum源是國內最好的yum源之一 ,無論是速度還是軟件版本,都非常的不錯。
將yum源設置為163 yum,可以提升軟件包安裝和更新的速度,同時避免一些常見軟件版本無法找到。
安裝步驟
首先備份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1
登錄后復制
下載對應版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前請做好相應備份)
-
CentOS5 :http://mirrors.163.com/.help/CentOS5-Base-163.repo
-
CentOS6 :http://mirrors.163.com/.help/CentOS6-Base-163.repo
-
CentOS7 :http://mirrors.163.com/.help/CentOS7-Base-163.repo
wget http://mirrors.163.com/.help/CentOS6-Base-163.repomv CentOS6-Base-163.repo CentOS-Base.repo
登錄后復制
運行以下命令生成緩存
yum clean allyum makecache
登錄后復制
除了網易之外,國內還有其他不錯的 yum 源,比如中科大和搜狐。
中科大的 yum 源,安裝方法查看:https://lug.ustc.edu.cn/wiki/mirrors/help/centos
sohu 的 yum 源安裝方法查看: http://mirrors.sohu.com/help/centos.htm
八. Linux 三劍客(awk,sed,grep)
awk、sed、grep更適合的方向:
-
grep 更適合單純的查找或匹配文本
-
sed 更適合編輯匹配到的文本
-
awk 更適合格式化文本,對文本進行較復雜格式處理
8.1 awk
AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。
之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
語法
awk [選項參數] 'script' var=value file(s)或awk [選項參數] -f scriptfile var=value file(s)
登錄后復制
選項參數說明:
-
-F fs or —field-separator fs指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。
-
-v var=value or —asign var=value賦值一個用戶定義變量。
-
-f scripfile or —file scriptfile從腳本文件中讀取awk命令。
-
-mf nnn and -mr nnn對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。
-
-W compact or —compat, -W traditional or —traditional在兼容模式下運行awk。所以gawk的行為和標準的awk完全一樣,所有的awk擴展都被忽略。
-
-W copyleft or —copyleft, -W copyright or —copyright打印簡短的版權信息。
-
-W help or —help, -W usage or —usage打印全部awk選項和每個選項的簡短說明。
-
-W lint or —lint打印不能向傳統unix平臺移植的結構的警告。
-
-W lint-old or —lint-old打印關于不能向傳統unix平臺移植的結構的警告。
-
-W posix打開兼容模式。但有以下限制,不識別:/x、函數關鍵字、func、換碼序列以及當fs是一個空格時,將新行作為一個域分隔符;操作符 和 =不能代替^ 和 ^=;fflush無效。
-
-W re-interval or —re-inerval允許間隔正則表達式的使用,參考(grep中的Posix字符類),如括號表達式[[:alpha:]]。
-
-W source program-text or —source program-text使用program-text作為源代碼,可與-f命令混用。
-
-W version or —version打印bug報告信息的版本。
基本用法
log.txt文本內容如下:
2 this is a test3 Are you like awkThis's a test10 There are orange,apple,mongo
登錄后復制
用法一:
awk '{[pattern] action}' {filenames} # 行匹配語句 awk '' 只能用單引號
登錄后復制
實例:
# 每行按空格或TAB分割,輸出文本中的1、4項 $ awk '{print $1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo # 格式化輸出 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo
登錄后復制
用法二:
awk -F #-F相當于內置變量FS, 指定分割字符
登錄后復制
實例:
# 使用","分割 $ awk -F, '{print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 There are orange apple # 或者使用內建變量 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 There are orange apple # 使用多個分隔符.先使用空格分割,然后對分割結果再使用","分割 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt --------------------------------------------- 2 this test 3 Are awk This's a 10 There apple
登錄后復制
用法三:
awk -v # 設置變量
登錄后復制
實例:
$ awk -va=1 '{print $1,$1+a}' log.txt --------------------------------------------- 2 3 3 4 This's 1 10 11 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt --------------------------------------------- 2 3 2s 3 4 3s This's 1 This'ss 10 11 10s
登錄后復制
用法四:
awk -f {awk腳本} {文件名}
登錄后復制
實例:
$ awk -f cal.awk log.txt
登錄后復制
運算符
運算符 描述 = += -= = /= %= ^= *= 賦值 ?: C條件表達式 \ \ 邏輯或 && 邏輯與 ~ 和 !~ 匹配正則表達式和不匹配正則表達式 < <= > >= != == 關系運算符 空格 連接 + – 加,減 * / % 乘,除與求余 + – ! 一元加,減和邏輯非 ^ * 求冪 ++ – 增加或減少,作為前綴或后綴 $ 字段引用 in 數組成員 過濾第一列大于2的行
$ awk '$1>2' log.txt #命令#輸出3 Are you like awkThis's a test10 There are orange,apple,mongo12345
登錄后復制
過濾第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令#輸出2 is123
登錄后復制
過濾第一列大于2并且第二列等于’Are’的行。另外,搜索公眾號Java架構師技術后臺回復“面試題”,獲取一份驚喜禮包。
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令#輸出3 Are you123
登錄后復制
內建變量
變量 描述 $n 當前記錄的第n個字段,字段間由FS分隔 $0 完整的輸入記錄 ARGC 命令行參數的數目 ARGIND 命令行中當前文件的位置(從0開始算) ARGV 包含命令行參數的數組 CONVFMT 數字轉換格式(默認值為%.6g)ENVIRON環境變量關聯數組 ERRNO 最后一個系統錯誤的描述 FIELDWIDTHS 字段寬度列表(用空格鍵分隔) FILENAME 當前文件名 FNR 各文件分別計數的行號 FS 字段分隔符(默認是任何空格) IGNORECASE 如果為真,則進行忽略大小寫的匹配 NF 一條記錄的字段的數目 NR 已經讀出的記錄數,就是行號,從1開始 OFMT 數字的輸出格式(默認值是%.6g) OFS 輸出記錄分隔符(輸出換行符),輸出時用指定的符號代替換行符 ORS 輸出記錄分隔符(默認值是一個換行符) RLENGTH 由match函數所匹配的字符串的長度 RS 記錄分隔符(默認是一個換行符) RSTART 由match函數所匹配的字符串的第一個位置 SUBSEP 數組下標分隔符(默認值是/034) $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txtFILENAME ARGC FNR FS NF NR OFS ORS RS---------------------------------------------log.txt 2 1 5 1log.txt 2 2 5 2log.txt 2 3 3 3log.txt 2 4 4 4$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txtFILENAME ARGC FNR FS NF NR OFS ORS RS---------------------------------------------log.txt 2 1 ' 1 1log.txt 2 2 ' 1 2log.txt 2 3 ' 2 3log.txt 2 4 ' 1 4# 輸出順序號 NR, 匹配文本行號$ awk '{print NR,FNR,$1,$2,$3}' log.txt---------------------------------------------1 1 2 this is2 2 3 Are you3 3 This's a test4 4 10 There are# 指定輸出分割符$ awk '{print $1,$2,$5}' OFS=" $ " log.txt---------------------------------------------2 $ this $ test3 $ Are $ awkThis's $ a $10 $ There $
登錄后復制
使用正則,字符串匹配
# 輸出第二列包含 "th",并打印第二列與第四列$ awk '$2 ~ /th/ {print $2,$4}' log.txt---------------------------------------------this a
登錄后復制
~ 表示模式開始。// 中是模式。
# 輸出包含 "re" 的行$ awk '/re/ ' log.txt---------------------------------------------3 Are you like awk10 There are orange,apple,mongo
登錄后復制
忽略大小寫
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt---------------------------------------------2 this is a testThis's a test
登錄后復制
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt---------------------------------------------Are likeaThere orange,apple,mongo$ awk '!/th/ {print $2,$4}' log.txt---------------------------------------------Are likeaThere orange,apple,mongo
登錄后復制
awk腳本
關于 awk 腳本,我們需要注意兩個關鍵詞 BEGIN 和 END。
-
BEGIN{ 這里面放的是執行前的語句 }
-
END {這里面放的是處理完所有的行后要執行的語句 }
-
{這里面放的是處理每一行時要執行的語句}
假設有這么一個文件(學生成績表):
$ cat score.txtMarry 2143 78 84 77Jack 2321 66 78 45Tom 2122 48 77 71Mike 2537 87 97 95Bob 2415 40 57 62
登錄后復制
我們的 awk 腳本如下:
$ cat cal.awk#!/bin/awk -f#運行前BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf "---------------------------------------------\n"}#運行中{ math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5}#運行后END { printf "---------------------------------------------\n" printf " TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR}123456789101112131415161718192021222324
登錄后復制
我們來看一下執行結果:
$ awk -f cal.awk score.txtNAME NO. MATH ENGLISH COMPUTER TOTAL---------------------------------------------Marry 2143 78 84 77 239Jack 2321 66 78 45 189Tom 2122 48 77 71 196Mike 2537 87 97 95 279Bob 2415 40 57 62 159--------------------------------------------- TOTAL: 319 393 350AVERAGE: 63.80 78.60 70.00
登錄后復制
另外一些實例
AWK 的 hello world 程序為:
BEGIN { print "Hello, world!" }
登錄后復制
計算文件大小
$ ls -l *.txt | awk '{sum+=$5} END {print sum}'--------------------------------------------------666581
登錄后復制
從文件中找出長度大于 80 的行:
awk 'length>80' log.txt
登錄后復制
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
登錄后復制
8.2 sed
Linux sed 命令是利用腳本來處理文本文件。
sed 可依照腳本的指令來處理、編輯文本文件。
Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等。
語法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
登錄后復制
參數說明:
-
-e<script>
或--expression=<script>
以選項中指定的script來處理輸入的文本文件。 -
-f
或–file=以選項中指定的script文件來處理輸入的文本文件。文件>文件>
-
-h或–help 顯示幫助。
-
-n或–quiet或–silent 僅顯示script處理后的結果。
-
-V或–version 顯示版本信息。
動作說明:
-
a :新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
-
c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
-
d :刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
-
i :插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
-
p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
-
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!
實例
在testfile文件的第四行后添加一行,并將結果輸出到標準輸出,在命令行提示符下輸入如下命令:
sed -e 4a\newLine testfile
登錄后復制登錄后復制
首先查看testfile中的內容如下:
$ cat testfile #查看testfile 中的內容 HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test
登錄后復制
使用sed命令后,輸出結果如下:
$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串 HELLO LINUX! #testfile文件原有的內容 Linux is a free unix-type opterating system. This is a linux testfile! Linux test newline
登錄后復制
以行為單位的新增/刪除
將 /etc/passwd 的內容列出并且列印行號,同時,請將第 2~5 行刪除!
[root@www ~] nl /etc/passwd | sed '2,5d'1 root:x:0:0:root:/root:/bin/bash6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown.....(后面省略).....
登錄后復制
sed 的動作為 ‘2,5d’ ,那個 d 就是刪除!因為 2-5 行給他刪除了,所以顯示的數據就沒有 2-5 行羅~ 另外,注意一下,原本應該是要下達 sed -e 才對,沒有 -e 也行啦!同時也要注意的是, sed 后面接的動作,請務必以 ‘’ 兩個單引號括住喔!
只要刪除第 2 行
nl /etc/passwd | sed '2d'
登錄后復制
要刪除第 3 到最后一行
nl /etc/passwd | sed '3,$d'
登錄后復制
在第二行后(亦即是加在第三行)加上『drink tea?』字樣!
[root@www ~] nl /etc/passwd | sed '2a drink tea'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologindrink tea3 daemon:x:2:2:daemon:/sbin:/sbin/nologin.....(后面省略).....
登錄后復制
那如果是要在第二行前
nl /etc/passwd | sed '2i drink tea'
登錄后復制
如果是要增加兩行以上,在第二行后面加入兩行字,例如 Drink tea or … 與 drink beer?
[root@www ~] nl /etc/passwd | sed '2a Drink tea or ......\> drink beer ?'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologinDrink tea or ......drink beer ?3 daemon:x:2:2:daemon:/sbin:/sbin/nologin.....(后面省略).....
登錄后復制
每一行之間都必須要以反斜杠『 \ 』來進行新行的添加喔!所以,上面的例子中,我們可以發現在第一行的最后面就有 \ 存在。
以行為單位的替換與顯示
將第2-5行的內容取代成為『No 2-5 number』呢?
[root@www ~] nl /etc/passwd | sed '2,5c No 2-5 number'1 root:x:0:0:root:/root:/bin/bashNo 2-5 number6 sync:x:5:0:sync:/sbin:/bin/sync.....(后面省略).....
登錄后復制
透過這個方法我們就能夠將數據整行取代了!
僅列出 /etc/passwd 文件內的第 5-7 行
[root@www ~] nl /etc/passwd | sed -n '5,7p'5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
登錄后復制
可以透過這個 sed 的以行為單位的顯示功能, 就能夠將某一個文件內的某些行號選擇出來顯示。
數據的搜尋并顯示
搜索 /etc/passwd有root關鍵字的行
nl /etc/passwd | sed '/root/p'1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh3 bin:x:2:2:bin:/bin:/bin/sh4 sys:x:3:3:sys:/dev:/bin/sh5 sync:x:4:65534:sync:/bin:/bin/sync....下面忽略
登錄后復制
如果root找到,除了輸出所有行,還會輸出匹配行。
使用-n的時候將只打印包含模板的行。
nl /etc/passwd | sed -n '/root/p'1 root:x:0:0:root:/root:/bin/bash
登錄后復制
數據的搜尋并刪除
刪除/etc/passwd所有包含root的行,其他行輸出
nl /etc/passwd | sed '/root/d'2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh3 bin:x:2:2:bin:/bin:/bin/sh....下面忽略#第一行的匹配root已經刪除了
登錄后復制
數據的搜尋并執行命令
搜索/etc/passwd,找到root對應的行,執行后面花括號中的一組命令,每個命令之間用分號分隔,這里把bash替換為blueshell,再輸出這行:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}' 1 root:x:0:0:root:/root:/bin/blueshell
登錄后復制
最后的q是退出。
數據的搜尋并替換
除了整行的處理模式之外, sed 還可以用行為單位進行部分數據的搜尋并取代。基本上 sed 的搜尋與替代的與 vi 相當的類似!他有點像這樣:
sed 's/要被取代的字串/新的字串/g'
登錄后復制
先觀察原始信息,利用 /sbin/ifconfig 查詢 IP
[root@www ~] /sbin/ifconfig eth0eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1.....(以下省略).....
登錄后復制
本機的ip是192.168.1.100。
將 IP 前面的部分予以刪除
[root@www ~] /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
登錄后復制
接下來則是刪除后續的部分,亦即:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
將 IP 后面的部分予以刪除
[root@www ~] /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'192.168.1.100
登錄后復制
多點編輯
一條sed命令,刪除/etc/passwd第三行到末尾的數據,并把bash替換為blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'1 root:x:0:0:root:/root:/bin/blueshell2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
登錄后復制
-e表示多點編輯,第一個編輯命令刪除/etc/passwd第三行到末尾的數據,第二條命令搜索bash替換為blueshell。
直接修改文件內容(危險動作)
sed 可以直接修改文件的內容,不必使用管道命令或數據流重導向!不過,由於這個動作會直接修改到原始的文件,所以請你千萬不要隨便拿系統配置來測試!我們還是使用文件 regular_express.txt 文件來測試看看吧!
regular_express.txt 文件內容如下:
[root@www ~] cat regular_express.txt runoob.google.taobao.facebook.zhihu-weibo-
登錄后復制
利用 sed 將 regular_express.txt 內每一行結尾若為 . 則換成 !
[root@www ~] sed -i 's/\.$/\!/g' regular_express.txt[root@www ~] cat regular_express.txt runoob!google!taobao!facebook!zhihu-weibo-
登錄后復制
:q:q
利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:
[root@www ~] sed -i '$a # This is a test' regular_express.txt[root@www ~] cat regular_express.txt runoob!google!taobao!facebook!zhihu-weibo-# This is a test
登錄后復制
由於 $ 代表的是最后一行,而 a 的動作是新增,因此該文件最后新增 # This is a test!
sed 的 -i 選項可以直接修改文件內容,這功能非常有幫助!舉例來說,如果你有一個 100 萬行的文件,你要在第 100 行加某些文字,此時使用 vim 可能會瘋掉!因為文件太大了!那怎辦?就利用 sed 啊!透過 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!
追加行的說明:
sed -e 4a\newLine testfile
登錄后復制登錄后復制
a 動作是在匹配的行之后追加字符串,追加的字符串中可以包含換行符(實現追加多行的情況)。
追加一行的話前后都不需要添加換行符 \n,只有追加多行時在行與行之間才需要添加換行符(最后一行最后也無需添加,添加的話會多出一個空行)。
man sed 信息:
Append text, which has each embedded newline preceded by a backslash.
登錄后復制
例如:
4 行之后添加一行:
sed -e '4 a newline' testfile
登錄后復制
4 行之后追加 2 行:
sed -e '4 a newline\nnewline2' testfile
登錄后復制
4 行之后追加 3 行(2 行文字和 1 行空行)
sed -e '4 a newline\nnewline2\n' testfile
登錄后復制
4 行之后追加 1 行空行:
#錯誤:sed -e '4 a \n' testfilesed -e '4 a \ ' testfile 實際上
登錄后復制
實際上是插入了一個含有一個空格的行,插入一個完全為空的空行沒有找到方法(不過應該沒有這個需求吧,都要插入行了插入空行干嘛呢?)
添加空行:
# 可以添加一個完全為空的空行sed '4 a \\'# 可以添加兩個完全為空的空行sed '4 a \\n'
登錄后復制
8.3 grep
Linux grep 命令用于查找文件里符合條件的字符串。
grep 指令用于查找內容包含指定的范本樣式的文件,如果發現某文件的內容符合所指定的范本樣式,預設 grep 指令會把含有范本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名為 –,則 grep 指令會從標準輸入設備讀取數據。
語法
grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<范本樣式>][-f<范本文件>][--help][范本樣式][文件或目錄...]
登錄后復制
參數:
-
-a 或 —text : 不要忽略二進制的數據。
-
-A<顯示行數> 或 —after-context=<顯示行數> : 除了顯示符合范本樣式的那一列之外,并顯示該行之后的內容。
-
-b 或 —byte-offset : 在顯示符合樣式的那一行之前,標示出該行第一個字符的編號。
-
-B<顯示行數> 或 —before-context=<顯示行數> : 除了顯示符合樣式的那一行之外,并顯示該行之前的內容。
-
-c 或 —count : 計算符合樣式的列數。
-
-C<顯示行數> 或 —context=<顯示行數>或-<顯示行數> : 除了顯示符合樣式的那一行之外,并顯示該行之前后的內容。
-
-d <動作> 或 —directories=<動作> : 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息并停止動作。
-
-e<范本樣式> 或 —regexp=<范本樣式> : 指定字符串做為查找文件內容的樣式。
-
-E 或 —extended-regexp : 將樣式為延伸的正則表達式來使用。
-
-f<規則文件> 或 —file=<規則文件> : 指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式為每行一個規則樣式。
-
-F 或 —fixed-regexp : 將樣式視為固定字符串的列表。
-
-G 或 —basic-regexp : 將樣式視為普通的表示法來使用。
-
-h 或 —no-filename : 在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱。
-
-H 或 —with-filename : 在顯示符合樣式的那一行之前,表示該行所屬的文件名稱。
-
-i 或 —ignore-case : 忽略字符大小寫的差別。
-
-l 或 —file-with-matches : 列出文件內容符合指定的樣式的文件名稱。
-
-L 或 —files-without-match : 列出文件內容不符合指定的樣式的文件名稱。
-
-n 或 —line-number : 在顯示符合樣式的那一行之前,標示出該行的列數編號。
-
-o 或 —only-matching : 只顯示匹配PATTERN 部分。
-
-q 或 —quiet或–silent : 不顯示任何信息。
-
-r 或 —recursive : 此參數的效果和指定”-d recurse”參數相同。
-
-s 或 —no-messages : 不顯示錯誤信息。
-
-v 或 —revert-match : 顯示不包含匹配文本的所有行。
-
-V 或 —version : 顯示版本信息。
-
-w 或 —word-regexp : 只顯示全字符合的列。
-
-x —line-regexp : 只顯示全列符合的列。
-
-y : 此參數的效果和指定”-i”參數相同。
實例
1、在當前目錄中,查找后綴有 file 字樣的文件中包含 test 字符串的文件,并打印出該字符串的行。此時,可以使用如下命令:
grep test *file
登錄后復制
結果如下所示:
$ grep test test* #查找前綴有“test”的文件包含“test”字符串的文件 testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行 testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行 testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
登錄后復制
2、以遞歸的方式查找符合條件的文件。例如,查找指定目錄/etc/acpi 及其子目錄(如果存在子目錄的話)下所有文件中包含字符串”update”的文件,并打印出該字符串所在行的內容,使用的命令為:
grep -r update /etc/acpi
登錄后復制
輸出結果如下:
$ grep -r update /etc/acpi #以遞歸的方式查找“etc/acpi” #下包含“update”的文件 /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
登錄后復制
3、反向查找。前面各個例子是查找并打印出符合條件的行,通過”-v”參數可以打印出不符合條件行的內容。
查找文件名中包含 test 的文件中不包含test 的行,此時,使用的命令為:
grep -v test *test*
登錄后復制
結果如下所示:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行 testfile1:helLinux! testfile1:Linis a free Unix-type operating system. testfile1:Lin testfile_1:HELLO LINUX! testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. testfile_1:THIS IS A LINUX TESTFILE! testfile_2:HELLO LINUX! testfile_2:Linux is a free unix-type opterating system.
登錄后復制
以上就是Linux命令大全的詳細內容,更多請關注www.92cms.cn其它相關文章!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-