1. 程式人生 > >Linux 從入門到熟練

Linux 從入門到熟練

目錄

一、檔案

【檔案許可權】

【檔案型別】:7種

二、Find|xargs

三、後臺執行命令

四、檔名置換

五、shell輸入與輸出

六、命令執行順序

七、正則表示式介紹

八、grep 家族

九、AWK 介紹

十、sed 用法介紹

【隨記】


一、檔案

【檔案許可權】


1) 讀,可以顯示該檔案的內容。
2) 寫,可以編輯或刪除它。
3) 執行,如果該檔案是一個shell指令碼或程式。

r w x:檔案屬主許可權這是前面三位
r- x:同組使用者許可權這是中間三位
r- x:其他使用者許可權這是最後三位
chmod命令 的符號模式
r w x  : u + o + g   總:a
chmod a-x  myfile rw- rw- rw- 收回所有使用者的執行許可權
chmod og-w myfile rw- r-- r- - 收回同組使用者和其他使用者的寫許可權
chmod g+w  myfile rw- rw- r- - 賦予同組使用者寫許可權
chmod u+x  myfile rwx rw- r- - 賦予檔案屬主執行許可權
chmod go+x myfile rwx rwx r- x 賦予同組使用者和其他使用者執行許可權
chmod命令 的絕對模式
r w x  : 4 + 2 + 1

-R選項:改變目錄樹下全部檔案許可權
chmod 644*:設定目錄下所有檔案的許可權

【檔案型別】:7種


d 目錄。
l 符號連結(指向另一個檔案)。
s 套接字檔案。
b 塊裝置檔案。
c 字元裝置檔案。
p 命名管道檔案。
- 普通檔案,或者更準確地說,不屬於以上幾種型別的檔案

【chown】:將一個檔案的所有權交給另外一個使用者
eg:-rwxrwxrwx 1 appbatop staf 345 Sep 20 14:33 test.txt
chown appadmin test.txt
-->-rwxrwxrwx 1 appadmin staf 345 Sep 20 14:33 test.txt
【chgrp】 : 改變檔案所屬使用者組
eg:-rwxrwxrwx 1 appbatop staf 345 Sep 20 14:33 test.txt
chown system test.txt
-->-rwxrwxrwx 1 appadmin system 345 Sep 20 14:33 test.txt
【ln 使用軟連結來儲存檔案的多個映像】
eg:ln [-s] source_path target_path

二、Find|xargs


Find命令的一般形式為:
find pathname -options [-print -exec -ok]
find命令有很多選項或表示式:
-name 按照檔名查詢檔案。
-perm 按照檔案許可權來查詢檔案。
-prune 使用這一選項可以使find命令不在當前指定的目錄中查詢,如果同時使用了-depth選項,那麼-prune選項將被find命令忽略。
-user 按照檔案屬主來查詢檔案。
-group 按照檔案所屬的組來查詢檔案。
-mtime -n +n 按照檔案的更改時間來查詢檔案,-n表示檔案更改時間距現在n天以內,+n表示檔案更改時間距現在n天以前。
-nogroup 查詢無有效所屬組的檔案,即該檔案所屬的組在/ etc / group s中不存在。
-nouser 查詢無有效屬主的檔案,即該檔案的屬主在/etc / passwd中不存在。
-newer file1 ! file2 查詢更改時間比檔案file1新但比檔案file2舊的檔案。
-type 查詢某一型別的檔案
-size n[c] 查詢檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計。
-depth 在查詢檔案時,首先查詢當前目錄中的檔案,然後再在其子目錄中查詢。
-fstype 查詢位於某一型別檔案系統中的檔案,這些檔案系統型別通常可以在配置檔案
-mount 在查詢檔案時不跨越檔案系統m o u n t點。
-follow 如果f i n d命令遇到符號連結檔案,就跟蹤至連結所指向的檔案。
-cpio 對匹配的檔案使用c p i o命令,將這些檔案備份到磁帶裝置
eg:[-name]
波浪號~代表了你的$HOME目錄。
$ find ~ -name "*.txt" -print
想要在當前目錄及子目錄中查詢所有的'*.txt'檔案,可以用:
$ find . -name "*.txt" -print
想要的當前目錄及子目錄中查詢檔名以一個大寫字母開頭的檔案,可以用:
$ find . -name "[A-Z]*" -print
想要在/etc目錄中查詢檔名以host開頭的檔案,可以用:
$ find /etc -name "host*" -print
想在當前目錄查詢檔名以兩個小寫字母開頭,跟著是兩個數字,最後是*.txt的檔案
$ find . -name "[a-z][a-z][0--9][0--9].txt" -print
[-perm]
在當前目錄下查詢檔案許可權位為755的檔案
$ find . -perm 755 -print
[-mtime]
在系統根目錄下查詢更改時間在5日以內的文
$ find / -mtime -5 -print
在/ v a r / a d m目錄下查詢更改時間在3日以前的檔案,可以用:
$ find /var/adm -mtime +3 -print
[-size]
為了在當前目錄下查詢檔案長度大於1M位元組的檔案,可以用:
$ find . -size +1000000c -print
為了在/home /apache目錄下查詢檔案長度恰好為100位元組的檔案,可以用:
$ find /home/apache -size 100c -print
為了在當前目錄下查詢長度超過10塊的檔案(一塊等於512位元組),可以用:
$ find . -size +10 -print
[-exec]
為了查詢系統中所有檔案長度為0的普通檔案,並列出它們的完整路徑,可以用:
$ find / -type f -size 333 -exec ls -l {} \;
[xargs]
在當前目錄下查詢檔案許可權位為777的檔案,包含cappdb
find . -perm 777 -print | xargs grep "cappdb"

三、後臺執行命令


名詞解釋:
cron :系統排程程序。可以使用它在每天的非高峰負荷時間段執行作業,或在一週或一月中的不同時段執行。
At   :at命令。使用它在一個特定的時間執行一些特殊的作業,或在晚一些的非負荷高峰時間段或高峰負荷時間段執行。
&    :使用它在後臺執行一個佔用時間不長的程序。
Nohup:使用它在後臺執行一個命令,即使在使用者退出時也不受影響。
【crontab】的格式:
分 時 日 月 星期 要執行的命令
註釋:可以用橫槓-來表示一個時間範圍,例如你希望星期一至星期五執行某個作業,那麼可以在星期域使用1-5來表示。還可以在這些域中使用逗號“,”,
例如你希望星期一和星期四執行某個作業,只需要使用1,4來表示。可以用星號*來表示連續的時間段。如果你對某個表示時間的域沒有特別的限定,
也應該在該域填入*。該檔案的每一個條目必須含有5個時間域,而且每個域之間要用空格分隔。該檔案中所有的註釋行要在行首用#來表示。
eg:
45 4 1,10,22 * * /apps/bin/backup.sh
上面的例子表示每月1,10,22日的4 : 4 5執行/apps/bin目錄下的backup.sh。

crontab命令的一般形式為:
Crontab [-u user] -e -l -r
其中:
-u 使用者名稱。
-e 編輯c r o n t a b檔案。
-l 列出c r o n t a b檔案中的內容。
-r 刪除c r o n t a b檔案。

【用ps命令檢視程序】ps -ef | grep 2564
殺死程序: kill 2564
       或  kill -9 2564
       或  nohup command &

四、檔名置換


特殊字元:
* 匹配檔名中的任何字串,包括空字串。
? 匹配檔名中的任何單個字元。
[...] 匹配[ ]中所包含的任何字元。
[!...] 匹配[ ]中非感嘆號!之後的字元。

五、shell輸入與輸出


【echo】
\c 不換行。
\f 進紙。
\t 跳格。
\n 換行。

echo "what\t\t are \tyou from"如果是LInux系統,需要加-e
$ echo "\"/dev/rmt0"\"   輸出結果為  "/dev/rmt0"


如果想把一個字串輸出到檔案中,使用重定向符號>
如果想追加到一個檔案的末尾,這意味著不覆蓋原有的內容:使用重定向符號>>
【read】
可以使用read語句從鍵盤或檔案的某一行文字中讀入資訊,並將其賦給一個變數。如果只
指定了一個變數,那麼r e a d將會把所有的輸入賦給該變數,直至遇到第一個檔案結束符或回車。
【cat】
cat命令最有用的選項就是:
-v 顯示控制字元
cat -v file 顯示檔案的控制字元(檢視是不是DOS格式)
【管道】  命令1 |命令2
who | awk '{print $1"\t"$2}' 只顯示使用者名稱和所在的終端。
df -k | awk :F '{print $1}' | grep -v "lvcmsdb"  展示去掉lvcmsdb的檔案系統
df -k | awk '{print $1}' | grep -v "lvcmsdb" | sed s'/\/dev\///g'     只展示分割槽名
$ sort myfile | lp
【tee】
-a表示追加到檔案末尾。
【exec】
使用這一命令時任何現有環境都將會被清除,並重新啟動一個shell。它的一般形式為:
exec command
【檔案重定向】
標準輸入
標準輸入是檔案描述符0。它是命令的輸入,預設是鍵盤,也可以是檔案或其他命令的輸出。
標準輸出
標準輸出是檔案描述符1。它是命令的輸出,預設是螢幕,也可以是檔案。
標準錯誤
標準錯誤是檔案描述符2。這是命令錯誤的輸出,預設是螢幕,同樣也可以是檔案
command > filename 把把標準輸出重定向到一個新檔案中(重定向符號一定要離開sort命令兩個空格,)
command >> filename 把把標準輸出重定向到一個檔案中(追加)
command 1 > fielname 把把標準輸出重定向到一個檔案中
command > filename 2>&1 把把標準輸出和標準錯誤一起重定向到一個檔案中
command 2 > filename 把把標準錯誤重定向到一個檔案中
command 2 >> filename 把把標準輸出重定向到一個檔案中(追加)
command >> filename 2>&1 把把標準輸出和標準錯誤一起重定向到一個檔案中(追加)
command < filename >filename2 把command命令以filename檔案作為標準輸入,以filename2檔案作為標準輸出
command < filename 把command命令以filename檔案作為標準輸入
command << delimiter 把從標準輸入中讀入,直至遇到delimiter分界符
command <&m 把把檔案描述符m作為標準輸入
command >&m 把把標準輸出重定向到檔案描述符m中
command <&- 把關閉標準輸入

六、命令執行順序


【&&】
命令1 && 命令2   只有命令1為真{即返回0},才會執行命令2
【||】
命令1 || 命令2   如果命令1執行失敗了,那麼就執行命令2


七、正則表示式介紹


                                           基本元字符集及其含義
-----------------------------------------------------------------------------------------------------------------
^ 只只匹配行首
$ 只只匹配行尾
* 只一個單字元後緊跟*,匹配0個或多個此單字元
[ ] 只匹配[ ]內字元。可以是一個單字元,也可以是字元序列。可以使用-表示[ ]內字元序列範圍,如用[1-5]代替[12345]
\ 只用來遮蔽一個元字元的特殊含義。因為有時在s h e l l中一些元字元有特殊含義。\可以使其失去應有意義
. 只匹配任意單字元
pattern\{n\} 只用來匹配前面pattern出現次數。n為次數
patern\{n,\}m 只含義同上,但次數最少為n
pattern\{n,m\} 只含義同上,但pattern出現次數在n與m之間
-----------------------------------------------------------------------------------------------------------------
1.使用\遮蔽一個特殊字元的含義
\ .
2.使用[]匹配一個範圍或集合
假定要匹配任意一個數字,可以使用:[0123456789]簡化操作:[0-9]
要匹配任意字母,則使用:     [A-Za-z]
假定要匹配一單詞,以s開頭,中間有一任意字母,以t結尾,那麼操作如下:s[a-z A-Z]t
如要匹配C o m p u t e r或c o m p u t e r兩個單詞,可做如下操作:[Cc]omputer
3.使用\{\}匹配模式結果出現的次數
匹配字母A出現兩次,並以B結尾:A\{2\}B   匹配值為AAB
匹配A至少4次  A\{4,\}B   AAAAB或AAAAAAAB,但不能為AAAB。
如給出出現次數範圍,例如A出現2次到4次之間  A \ { 2 , 4 \ } B  則結果為A A B、A A A B、A A A A B,而不是A B或A A A A A B等。

八、grep 家族

常用的grep選項有:
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字元)。
-h 查詢多檔案時不顯示檔名。
-l 查詢多檔案時只輸出包含匹配字元的檔名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文字的錯誤資訊。
-v 顯示不包含匹配文字的所有行。
eg:
如果要在當前目錄下所有檔案中查詢字串“sort”*.doc,方法如下:
$ grep "sort"*.doc
或在所有檔案中查詢單詞“sort it”
$ grep "sort it" *
使用grep抽取精確匹配的一種更有效方式是在抽取字串後加\ >
grep -v -n "ROOT\>" grep.sh
有時要查詢重複出現次數在一定範圍內,比如數字或字母重複出現2到6次,下例匹配數字ROOT重複出現2到6次,並以3結尾
grep 'ROOT\{2,6}3' grep.sh
匹配特殊字元
grep '\"' grep.sh
查詢IP地址
grep '[0-9]\{2\}\.[0-0]\{3\}\.' ipfile
查詢行尾包含單詞device的所有行
grep 'device$' grep.sh
查詢目錄列表中d開始的目錄
grep '^d'
查詢不包含目錄的所有檔案
grep '^[^d]'
使用ps命令.檢視程序
ps -ef或ps -ax 

九、AWK 介紹

語言的最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊
【awk '{print $0}' grep.sh】
註釋:'{print $0}'列印所有域的資料,$+number表示列印的域
【列印報告頭】:如果想將列印資訊頭放置在BEGIN模式部分,因為列印資訊頭被界定為一個動作,必須用大括號括起來。在awk檢視第一條記錄前,資訊頭被列印
awk 'BEGIN {print "Name    Belt\n-----------------------------------"}{print $1"\t"$2}' grep.sh
輸出:
Name                        Belt
-----------------------------------
BATCHDATA         BATCHDATA
SCRIPTROOT      SCRIPTROOT
LIBROOT                  LIBROOT
【列印資訊尾】:
awk 'BEGIN {print "Name\n---------------"}{print $1} END {"end-of-report"}' grep.sh
輸出結果尾輸出:end-of-report
【匹配】:在grep.sh指令碼篩選ROOT   使一域號匹配正則表示式,使用符號‘~’後緊跟正則表示式
倆種寫法:
awk '{if($1~/ROOT/) print $0}' grep.sh
awk '$0 ~ /ROOT/' grep.sh
【精確匹配】
awk '$2=="02/12" {print $0}' grep.sh
【不匹配】有時要瀏覽資訊並抽取不匹配操作的記錄,與~相反的符號是!~,意即不匹配
awk '{if($1!~/ROOT/) print $0}' grep.sh
【判斷大小】
awk 'if($6>$7)print $0' grep.sh
awk '{if($6>$7)print $0 "$1 Try to better an the next comp"}' grep.sh
------------------------awk內建變數---------------------------------
ARGC 命令列引數個數
ARGV 命令列引數排列
ENVIRON 支援佇列中系統環境變數的使用
FILENAME awk瀏覽的檔名
FNR 瀏覽檔案的記錄數
FS 設定輸入域分隔符,等價於命令列- F選項
NF 瀏覽記錄的域個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
------------------------------------------------------------------
awk '{print ARGC,NF,NR,ORS,RS,$0}' grep.sh


十、sed 用法介紹

是一個非互動性文字流編輯器

1 使用sed命令列格式為:
sed [選項] sed命令 輸入檔案。
2 使用sed指令碼檔案,格式為:
sed [選項] -f sed指令碼檔案 輸入檔案
3 要使用第一行具有s e d命令直譯器的s e d指令碼檔案,其格式為:
sed指令碼檔案 [選項] 輸入檔案
sed選項如下:
n 不列印;sed不寫編輯行到標準輸出,預設為列印所有行(編輯和未編輯)。p命令可以用來列印編輯行。
c 下一命令是編輯命令。使用多項編輯時加入此選項。如果只用到一條sed命令,此選項無用,但指定它也沒有關係。
f 如果正在呼叫sed指令碼檔案,使用此選項。此選項通知sed一個指令碼檔案支援所有的sed命令,例如:sed -f myscript.sed input_file,這裡myscript.sed即為支援sed命令的檔案


-------------------------使用sed在檔案中定位文字的方式-------------------------
x   x為一行號,如1
x,y  表示行號範圍從x到y,如2,5表示從第2行到第5行
/pattern/  查詢包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/  查詢包含兩個模式的行。例如/disk/disks/
pattern/,x  在給定行號上查詢包含模式的行。如/ribbon/,3
x,/pattern/  通過行號和模式查詢匹配行。3 . /vdu/
x,y!  查詢不包含指定行號x和y的行。1 , 2 
----------------------------------------------------------------------------------

-----------------------------------sed編輯命令-----------------------------
p 列印匹配行
= 顯示檔案行號
a\ 在定位行號後附加新文字資訊
i\ 在定位行號後插入新文字資訊
d 刪除定位行
c\ 用新文字替換定位文字
s 使用替換模式替換相應模式
r 從另一個檔案中讀文字
w 寫文字到一個檔案
q 第一個模式匹配完成後推出或立即推出
l 顯示與八進位制A S C I I程式碼等價的控制字元
{ } 在定位行執行的命令組
n 從另一個檔案中讀文字下一行,並附加在下一行
g 將模式2貼上到/pattern n/
y 傳送字元
n 延續到下一輸入行;允許跨行的模式匹配語句如果
-----------------------------------------------------------------------------
【輸出文字】
輸出文字第二行
sed -n '2p' grep.sh
輸出文字第一行至第三行
sed -n '1,3p' grep.sh
第四行查詢模式the
sed -n '4,/ROOT/'p grep.sh
輸出最後一行
sed -n '$p' grep.sh
匹配元字元$
sed -n '/\$/'p grep.sh
【刪除文字】輸出刪除,文字並沒有刪除
刪除第二行
sed '1,3d' grep.sh
第四行查詢模式the
sed -n '4,/ROOT/d' grep.sh
【替換文字】
替換命令用替換模式替換指定模式,格式為:
[ address[,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
替換選項如下:
g 預設情況下只替換第一次出現模式,使用g選項替換全域性所有出現模式。
p 預設sed將所有被替換行寫入標準輸出,加p選項將使- n選項無效。- n選項不列印輸出結果。
w 檔名使用此選項將輸出定向到一個檔案
eg:
刪除$符號
sed '/\$//' grep
替換所有
sed 's/ROOT/ HELLO/g' grep.sh
替換結果寫入一個檔案sed.out用w選項,
sed 's/hello/HELLO/w sed.out' grep.sh
修改字串
sed 's/ROOT/from beijing &/p' grep.sh
輸出結果:I han kankanfrom beijing ROOT one
原句:I han kankan ROOT one
【從檔案中讀文字】
格式為:
address r filename
eg:
sedex.txt內容附加到檔案quote.txt的拷貝。在模式匹配行/company/後放置附加文字
sed '//'
【】
【】
【】


【隨記】


1.只輸出當前時間
tempTime=`date +%T`
2.-ge 第一個數大於等於第二個數
if [ "$hh" -ge "05" ]; then
-eq 數值相等。(equal)
-ne 數值不相等。(unequal)
-gt 第一個數大於第二個數。(greater than)
-lt 第一個數小於第二個數。(less than)
-le 第一個數小於等於第二個數。
3.資料檔案進行轉碼(UTF-8轉成GBK)
iconv -f UTF-8 -t GB18030 HYCustomerInfo102.dat > HYCustomerInfo102.dat
3.1檢視一個檔案的格式:
    a:vi 檔案
        b:set fileencoding

4.新建
    mkdir  + 檔名
    touch + xxx.sh
5.刪除檔案
rm + 檔名
rm -rf + 檔案 : 刪除目錄下所有檔案
rm -f + 檔案:強制刪除
6.檢視檔案行數
    wc -l 檔案
7.檢視資料夾下檔案個數
    ls -l|grep "^-"|wc -l
    檢視資料夾下目錄的個數
    ls -l|grep "^d"|wc -l
    檢視資料夾下檔案個數,包括子目錄下的
    ls -lR|grep "^-v"|wc -l
8.du -h    //檢視當前目錄下檔案大小
9.ps -ef |grep ele    //檢視ele程序
10.crontab -l (-e)   //定時任務 -l顯示 -e修改


--拷貝資訊到144伺服器
scp orgCopyBatch.sh [email protected]:/home/appncss/baicun
scp -r ./* [email protected]:/cbpt/batch  

---ftp命令把遠端計算機的檔案傳輸到本地計算機,需要和使用者互動
ftp -niv <<-EOF
open 22.5.96.162
user citicbank citicbank
prompt off
bin
cd /opt/IBM/WebSphere/AppServer/profiles/node01/logs/cbpsServer11
bin
get  SystemOut.log
bin
get  SystemErr.log

bye
EOF
-----------------------
--拷貝資訊到144伺服器
scp orgCopyBatch.sh [email protected]:/home/appncss/baicun
scp -r ./* [email protected]:/cbpt/batch  

下載 sz
上傳 rz -be

--------檢視檔案 more -------
more 語法:more[引數選項][檔案]
引數:
    +num        從第num行開始顯示
    -num        定義螢幕大小為num行
    +/pattern    從pattern前兩行開始顯示
    -c            從頂部清屏然後顯示
    -s            把連續的多個空行顯示為一行


退出指令:q
顯示下一屏:ctrl+f(或空格鍵)
返回上一屏:ctrl+b
輸出當前行號:=
輸出檔名和當前的行號::f
呼叫vi編輯器:v

---------檢視檔案 less more和less首選less命令--------------
less 語法:less[引數] 檔案
引數:
-c        :從頂部(從上到下)重新整理螢幕,並顯示檔案內容
-m        :顯示讀取檔案的百分比
-M        :顯示讀行號的百分比,行號和總行數
-N        :在每行前輸出行號

less -MN 檔案

向下移動一行:回車鍵
向上移動一行:y
向下滾動一屏:空格鍵 
向上滾動一屏:b
從指定的下一行開始顯示:w
跳到第一行:g
跳到最後一行:G
從檔案百分之10處開始顯示:p 10%
退出:q

 ---------殺程序--------------
 kill   12354
 
殺發郵件程序
kill $(ps -ef |grep gci_are_BusinessHistory.xml |grep -v grep |awk '{print $2}')