Linux與unix Shell編程指南 總結

分享一下我老師大神的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

               

Unix命令行程序和內建指令(更多)

文件系統
 cat cd chmod chown
 chgrp cksum cmp cp
 du df fsck fuser
 ln ls lsattr lsof
 mkdir mount mv pwd
 rm rmdir split touch
 umask   
 
程序
 at bg chroot cron
 exit fg jobs kill
 killall nice pgrep pidof
 pkill ps pstree sleep
 time top wait 
 
使用環境
 env finger id logname
 mesg passwd su sudo
 uptime w wall who
 whoami write  
 
文字編輯
 awk comm cut ed
 ex fmt head iconv
 join less more paste
 sed sort strings talk
 tac tail tr uniq
 vi wc xargs 
 
Shell 程序
 alias basename dirname echo
 expr false printf test
 true unset  
 
網絡
 inetd netstat ping rlogin
 netcat traceroute  
 
搜索
 find grep locate whereis
 which   
 
雜項
 apropos banner bc cal
 clear date dd file
 help info size lp
 man history tee tput
 type yes uname whatis



1. 文件權限

$ls   -l- rw-r--r-- 1   dave    admin    300   Fed 19 22:05  myfile

文件類型     文件權限   文件屬主   文件屬主dave 的用戶組   文件字節長度    文件更新時間      文件名
 -                    rw-r--r-- 1    dave                admin                    300                  Fed 19 22:05        myfile

 1 .文件類型
文件權限位前面的那個字符,我們例子中的橫槓就是文件的類型,即普通文件類型。
文件類型有七種,它可以從 ls -l命令所列出的結果的第一位看出:
d   目錄。l  符號鏈接(指向另一個文件)。s  套接字文件。b  塊設備文件。c  字符設備文件。p  命名管道文件。
-    普通文件,或者更準確地說,不屬於以上幾種類型的文件。

2.文件的權限:

文件的權限可分爲三類:
1) 文件屬主,創建該文件的用戶。如 -rw:文件屬主權限 這是前面三位
2) 同組用戶,擁有該文件的用戶組中的任何用戶。如 -r-: 同組用戶權限 這是中間三位
3) 其他用戶,即不屬於擁有該文件的用戶組的某一用戶。如 -r-:其他用戶權限 這是最後三位

3.修改權限: chmod

1)符合模式:chmod [who]  operator [permission]  filename

who的含義是:u文件屬主權限。g同組用戶權限。o其他用戶權限。a所有用戶(文件屬主、同組用戶及其他用戶)。
operator的含義:+ 增加權限。-取消權限。= 設定權限。
permission的含義:r讀權限。w寫權限。執行權限。s 文件屬主和組set -ID。t 粘性位*。給文件加鎖,使其他用戶無法訪問。

u,g,o   針對文件屬主、同組用戶及其他用戶的操作。

chmod u+x myfile  //賦予文件屬主執行權限
2) 絕對模式:  chmod  [mode]   file
其中mode是一個八進制數:
0400 文件屬主可讀        0040 同組用戶可讀          0004 其他用戶可讀
0200 文件屬主可寫        0020 同組用戶可寫          0002 其他用戶可寫
0100 文件屬主可執行    0010 同組用戶可執行       0001 其他用戶可執行
myfile文件具有這樣的權限:
  rw-         r--         r--
  4+2        4         4

把相應權限位所對應的值加在一起,就是644。

4.chown和chgrp

chown命令的一般形式爲:
chown -R -h owner file
- R選項意味着對所有子目錄下的文件也都進行同樣的操作。

 - h選項意味着在改變符號鏈接文件的屬主時不影響該鏈接所指向的目標文件。

如:

$ chown mysql hiscore 把 hiscore文件的屬主改爲mysql
$ chown -R mysql hiscore 遞歸地把hiscore(數據庫名稱)目錄下的所有文件屬主改成mysql

chgrp命令和chown命令的格式差不多

chgrp sybadmin project

把project文件所屬的組由admin變爲sybadmin(系統中的另外一個用戶組) 。

2. ls、find和xargs

ls使用技巧

以找到當前目錄中最大的那個文件:

ls -lSrh


“r”的作用是將大的文件列在後面,而“h”則是給出易於人們閱讀的輸出(MB或者諸如此類)。你也可以搜尋最大的MP3/MPEG文件:

ls -lSrh *.mp*

你也可以通過下面這條命令搜尋最大的目錄:

du -kx | egrep -v "\./.+/" | sort -n



Find命令的一般形式爲:

find pathname -options [-print -exec -ok]
讓我們來看看該命令的參數:
    pathname   find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
   -options      爲命令選項
   -print           find命令將匹配的文件輸出到標準輸出。
   -exec         find命令對匹配的文件執行該參數所給出的 shell命令。相應命令的形式爲 ' comm -and' {} \;,注意{ }和\;之間的空格。
   -ok   和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的 shell命令,
在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

1.  find命令選項

   -name   按照文件名查找文件。
   -perm   按照文件權限來查找文件。
   -prune   使用這一選項可以使find命令不在當前指定的目錄中查找,                                                                                                                                  如果同時使用了-depth選項,那麼-prune選項將被find命令忽略。
   -user   按照文件屬主來查找文件。
   -group   按照文件所屬的組來查找文件。
   -mtime   -n +n   按照文件的更改時間來查找文件,
                - n表示文件更改時間距現在n天以內,+ n表示文件更改時間距現在n天以前。 
                find命令還有- atime和-ctime選項,但它們都和-mtime選項相似,所以我們在這裏只介紹- mtime選項。
   -nogroup   查找無有效所屬組的文件,即該文件所屬的組在 /etc/groups中不存在。
   -nouser   查找無有效屬主的文件,即該文件的屬主在 /etc/passwd中不存在。
   -newer file1 ! file2   查找更改時間比文件file1新但比文件file2舊的文件。
   -type   查找某一類型的文件,諸如:
   b - 塊設備文件。
   d - 目錄。
   c - 字符設備文件。
   p - 管道文件。
   l - 符號鏈接文件。
   f - 普通文件。
  -size n[c]   查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。
  -depth   在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
  -fstype   查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etcfstab中找到,該配置文件中包含了本系統中有關文件系統的信息。
   -mount   在查找文件時不跨越文件系統mount點。
   -follow   如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
   -cpio   對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。

2. find的例子:

1)匹配$ H O M E目錄下的所有文件,下面兩種方法都可以使用:
$ find $HOME -print
$ find ~ -print

2) 在當前目錄中查找suid置位,文件屬主具有讀、寫、執行權限,並且文件所屬組的用戶和其他用戶具有讀和執行的權限的文件,可以用:
$ find . -type f -perm 4755 -print
3 )查找系統中所有文件長度爲0的普通文件,並列出它們的完整路徑,可以用:

        $ find / -type f -size 0 -exec ls -l {} \;

可以按照文件長度來查找文件,這裏所指的文件長度既可以用塊(block)來計量,也可以用字節來計量。以字節計量文件長度的表達形式爲N c;以塊計量文件長度只用數字表示即可。  

在按照文件長度查找文件時,一般使用這種以字節表示的文件長度,在查看文件系統的大小,因爲這時使用塊來計量更容易轉換。  

實例1:在當前目錄下查找文件長度大於1 M字節的文件  

命令:

find . -size +1000000c -print

實例2:在/home/apache目錄下查找文件長度恰好爲100字節的文件:  

命令:

find /home/apache -size 100c -print  

實例3:在當前目錄下查找長度超過10塊的文件(一塊等於512字節) 

命令:

find . -size +10 -print



4) 查找/var/logs目錄中更改時間在7日以前的普通文件,並刪除它們,可以用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;
5) 查找系統中所有屬於audit組的文件,可以用:
$find /-name -group audit -print
6) 我們的一個審計系統每天創建一個審計日誌文件。日誌文件名的最後含有數字,這樣我們一眼就可以看出哪個文件是最新的,哪個是最舊的。 admin.log文件編上了序號:
admin.log.001、admin.log.002等等。下面的find命令將刪除/logs目錄中訪問時間在7日以前、含有數字後綴的admin.log文件。該命令只檢查三位數字,所以相應日誌文件的後綴不要超過999。
$ find /logs -name 'admin.log[0-9][0-9][0-9] '-atime +7 -exec rm {} \;
7) 查找當前文件系統中的所有目錄並排序,可以用:
$ find . -type d -print -local -mount |sort
8) 查找系統中所有的rmt磁帶設備,可以用:
$ find /dev/rmt -print

9)從根目錄開始查找所有擴展名爲.log的文本文件,並找出包含”ERROR”的行:

$ find / -type f -name "*.log" | xargs grep "ERROR" 


10、使用find在多個文件中替換掉相同的文本

要替換當前目錄以及下層目錄裏所有文件中的Windows爲Linux,你可以這樣運行:

find . -name '*.txt' -print | xargs perl -pi -e's/Windows/Linux/ig' *.txt


或者如果你更需要讓它只作用於普通文件上

find -type f -name '*.txt' -print0 | xargs --null perl -pi -e 's/Windows/Linux/'




3. 後臺執行命令

1. crontab

1). crontab的域

是crontab的格式:
分  時  日  月  星期 要運行的命令
第1列 分鐘1~59
第2列 小時1~23(0表示子夜)
第3列 日1~31
第4列 月1~12
第5列 星期0~6(0表示星期天)
第6列 要運行的命令
crontab文件的一個條目是從左邊讀起的,第一列是分,最後一列是要運行的命令,它位於星期的後面。
用橫槓-來表示一個時間範圍,例如你希望星期一至星期五運行某個作業,那麼可以在星期域使用1-5來表示。
使用逗號“,” ,例如你希望星期一和星期四運行某個作業,只需要使用 1,4來表示。
用星號 *來表示連續的時間段。如果你對某個表示時間的域沒有特別的限定,也應該在該域填入 *。
該文件的每一個條目必須含有 5個時間域,而且每個域之間要用空格分隔。該文件中所有的註釋行要在行首用#來表示。

例子:

分 時 日 月 星期 要運行的命令
30 21 *   *  *   /apps/bin/cleanup.sh :表示每晚的21:30運行/apps/bin目錄下的cleanup.sh。
45 4  1,10,22 * * /apps/bin/backup.sh :表示每月1、10、22日的4:45運行/apps/b i n目錄下的backup.sh。
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; :表示每週六、週日的1 : 1 0運行一個f i n d命令。
0,30 18-23 * * * /apps/bin/dbcheck.sh:表示在每天18:00至23:00之間每隔30分鐘運行/apps/bin目錄下的dbcheck.sh。
0 23 * * 6 /apps/bin/qtrend.sh :表示每星期六的11:00pm運行/apps/bin目錄下的qtrend.sh。

每隔30分鐘時運行:

*/30 * *   *  *   /apps/bin/cleanup.sh :

2) 創建和提交crontab文件:
創建一個名爲davecron。的文件,加入如下的內容:
#15 minutes between 6pm and 6am
0,15,30,45 18-06 * * *  /bin/echo `date` > /dev/console
系統將每隔 15分鐘向控制檯輸出一次當前時間。
如果系統崩潰或掛起,從最後所顯示的時間就可以一眼看出系統是什麼時間停止工作的。
提交crontab文件,cron命令的參數:
$ crontab davecron
現在該文件已經提交給cron進程,它將每隔1 5分鐘運行一次。
同時,新創建文件的一個副本已經被放在/var/spool/cron目錄中,文件名就是用戶名davecron。

2) 常用參數:

crontab   -l   //查看當前用戶下的cron任務
crontab -e  //編輯當前用戶的定時任務
crontab -u  linuxso  -e  //編輯用戶linuxso的定時任務
crontab -r   //刪除crontab文件
注意:編輯crontab文件,最好先選擇好編輯器,選vim(3):

update-alternatives --config editor

There are 3 choices for the alternative editor (providing /usr/bin/editor).  Selection    Path               Priority   Status------------------------------------------------------------  0            /bin/nano           40        auto mode  1            /bin/ed            -100       manual mode  2            /bin/nano           40        manual mode  3            /usr/bin/vim.tiny   10        manual mode

3) $HOME目錄中對crontab文件做一備份:
$crontab -l > $HOME/mycron
4) 恢復丟失的crontab文件:
如果不小心誤刪了crontab文件,假設你在自己的$HOME目錄下還有一個備份,那麼可以將其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。如果由於權限問題無法完
成拷貝,可以用:
$ crontab <filename>
其中,<filename>是你在$HOME目錄中副本的文件名。
我建議你在自己的$HOME目錄中保存一個該文件的副本。我就有過類似的經歷,有數次誤刪了crontab 文件(因爲r鍵緊挨在e鍵的右邊…) 。這就是爲什麼有些系統文檔建議不要直接
編輯crontab 文件,而是編輯該文件的一個副本,然後重新提交新的文件。
有些crontab 的變體有些怪異,所以在使用crontab 命令時要格外小心。如果遺漏了任何選
項,crontab 可能會打開一個空文件,或者看起來像是個空文件。這時敲crontab 鍵退出,不要按
< Ctrl - D >,否則你將丟失crontab 文件。

查看crontab服務狀態:service crond status

手動啓動crontab服務:service crond start

2. at命令提交命令或者shell腳本

1)at命令使用
at命令允許用戶向cron守護進程提交作業,使其在稍後的時間運行。這裏稍後的時間可能是指10min以後,也可能是指幾天以後。如果你希望在一個月或更長的時間以後運行,最好還是使用crontab文件。一旦一個作業被提交, at命令將會保留所有當前的環境變量,包括路徑,不象crontab,只提供缺省的環境。該作業的所有輸出都將以電子郵件的形式發送給用戶,除非你對其輸出進行了重定向,絕大多數情況下是重定向到某個文件中。和crontab一樣,根用戶可以通過/etc目錄下的at.allow和at.deny文件來控制哪些用戶可以使用at命令,哪些用戶不行。不過一般來說,對at命令的使用不如對crontab的使用限制那麼嚴格。
at命令的基本形式爲:
at [-f script] [-m -l -r] [time] [date]
其中,
-f script 是所要提交的腳本或命令。
-l 列出當前所有等待運行的作業。at q命令具有相同的作用。
-r 清除作業。爲了清除某個作業,還要提供相應的作業標識(ID);有些UNIX變體只接受atrm作爲清除命令。
-m 作業完成後給用戶發郵件。
time at命令的時間格式非常靈活:
1) 可以是H、HH.HH MM、HH : MM或H:M,其中H和M分別是小時和分鐘。還可以使用a.m.或p.m.。
2)date日期格式可以是月份數或日期數,而且at命令還能夠識別諸如today、tomorrow這樣的詞。現在就讓我們來看看如何提交作業。

2)使用at命令提交命令或腳本
使用at命令提交作業有幾種不同的形式,可以通過命令行方式,也可以使用at命令提示符。
一般來說在提交若干行的系統命令時,我使用at命令提示符方式,而在提交s h e l l腳本時,使用命令行方式。
如果你想提交若干行的命令,可以在at命令後面跟上日期/時間並回車。然後就進入了at命令提示符,這時只需逐條輸入相應的命令,然後按‘ <CTRL - D>’退出。下面給出一個例子:
root@ubuntu:/home/hadoop/testsh# at 16:10
warning: commands will be executed using /bin/sh
at> find /etc -name "passwd" -print
at> <EOT>
at> job 1 at 2012-10-22 16:10     
其中, 
<EOT>就是<CTRL - D>。在16:10  系統將執行一個簡單的find命令。
你應當已經注意到,我所提交的作業被分配了一個唯一標識job 1。該命令在完成以後會將全部結果以郵件的形式發送給我。
如果希望向at命令提交一個shell腳本,使用其命令行方式即可。在提交腳本時使用- f選項。
$ at 3.00pm tomorrow -f /apps/bin/db_table.sh
warning: commands will be executed using /bin/sh
job 8 at 2012-10-23 15:00
在上面的例子中,一個叫做db_table.sh的腳本將在明天下午3:00運行。
還可以使用echo命令向at命令提交作業:

$ echo find /etc -name "passwd" -print | at now +1 minute

4. shell輸入與輸出

1 . echo 
字符串被重定向到一個名爲myfile文件中:
$ echo "The log files have all been done"> myfile
2 . read 
可以使用read 語句從鍵盤或文件的某一行文本中讀入信息,並將其賦給一個變量。如果只
指定了一個變量,那麼read 將會把所有的輸入賦給該變量,直至遇到第一個文件結束符或回
車。
它的一般形式爲:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章