Linux Shell介紹

寫於2014年冬

簡述

  • Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令並把它送入內核去執行。
  • 實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令並且把它們送到內核。不僅如此,Shell有自己的編程語言用於對命令的編輯,它允許用戶編寫由shell命令組成的程序。Shell編程語言具有普通編程語言的很多特點,比如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果。
  • 同Linux本身一樣,Shell也有多種不同的版本。主要有下列版本的Shell
    • Bourne Shell:Bourne shell 是UNIX 最初使用的shell,並且在每種UNIX 上都可以使用。Bourne
      shell 在shell 編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。
    • BASH:它是Bourne shell 的擴展,簡稱bash 。與Bourne shell 完全向後兼容,並且在Bourne shell
      的基礎上增加增強了很多特性,它還包含了很多C shell 和Kornshell 中的優點,有靈活和強大的編程接口同時又有很友好的用戶界面。
    • C Shell: C shell 是一種比Bourne shell 更適於編程的shell, 它的語法與C 語言很相似。Linux爲喜歡使用C shell 的人提供了Tcsh。 Tcsh 是C shell 的一個擴展版本。Tcsh包括命令行編輯可編程單詞補全、拼寫校正歷史命令替換、作業控制和類似C語言的語法。它不僅和Bash shell是提示符兼容而且還提供比Bashshell 更多的提示符參數。
    • Korn shell 集合了C shell 和Bourne shell 的優點並且和Bourne shell 完全兼容Linux 系統提供了pdksh (ksh 的擴展),它支持任務控制,可以在命令行上掛起、後臺執行、喚醒或終止程序
    • Z Shell:The last shell you’ll ever need! Z是最後一個字母,也就是終極Shell。它集成了bash、ksh的重要特性,同時又增加了自己獨有的特性。

變量與表達式

  • $# : 保存程序命令行參數的數目
  • $? : 保存前一個命令的返回碼
  • $0 : 保存程序名
  • :" 1 $2…”)的形式保存所有輸入的命令行參數
  • @:" 1”“$2”…)的形式保存所有輸入的命令行參數
  • -r file : 當file是一個可讀文件時,返回True
  • -w file : 當file是一個可寫文件時,返回True
  • -x file : 當file是一個可執行文件時,返回True
  • -e file : 當file存在時,返回True
  • -o file : 當file文件的所有者是當前用戶時,返回True
  • -z file : 當file長度爲0時,返回True
  • -f file : 當file是一個普通文件時,返回True
  • -d file : 當file是一個目錄時,返回True
  • Exp1 || exp2 : 當exp1和exp2的值至少一個爲True時,返回True
  • Exp1 && exp2 : 當exp1和exp2的值同爲True時,返回True
  • ! exp : 當exp的值爲False時,返回True

正則表達式

  • 操作符 用途
    • .(句號) 匹配任意單個字符。
    • ^(脫字號) 匹配出現在行首或字符串開始位置的空字符串。
    • $(美元符號) 匹配出現在行末的空字符串。
    • A 匹配大寫字母 A。
    • a 匹配小寫字母 a。
    • \d 匹配任意一位數字。
    • \D 匹配任意單個非數字字符。
    • \w 匹配任意單個字母數字字符,同義詞是 [:alnum:]。
    • [A-E] 匹配任意大寫的 A、B、C、D 或 E。
    • [^A-E] 匹配除 A、B、C、D 和 E 之外的任意字符。
    • X? 匹配出現零次或一次的大寫字母 X。
    • X* 匹配零個或任意個大寫 X。
    • X+ 匹配一個或多個字母 X。
    • X{n} 精確匹配 n 個字母 X。
    • X{n,m} 匹配最少 n 個並且不超過 m 個字母 X。如果省略 m,表達式將嘗試匹配最少 n 個 X。
    • (abc|def)+ 匹配一連串的(最少一個) abc 或 def;abc 和 def 將匹配。

find 和 xargs

  • find是在系統中查找具有某一特徵的文件 (例如文件權限、文件屬主、文件長度、文件類型等等 )
  • 選項
    • -name 按照文件名查找文件。
    • -perm 按照文件權限來查找文件。
    • -prune 使用這一選項可以使 find命令不在當前指定的目錄中查找,如果同時使用了 -depth選項,那麼prune選項將被find命令忽略。
    • -user 按照文件屬主來查找文件。
    • -group 按照文件所屬的組來查找文件。
    • -mtime -n +n 按照文件的更改時間來查找文件, - n表示文件更改時間距現在 n天以內, + n表示文件更改時間距現在 n天以前。
    • -newer file1 ! file2 查找更改時間比文件 file1 新但比文件 file2舊的文件。
    • -depth 在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
  • xargs
    • 在使用 find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。
    • 選項
      • -0 當sdtin含有特殊字元時候,將其當成一般字符,想/’空格等
      • -p 操作具有可交互性,每次執行comand都交互式提示用戶選擇
      • -I xargs的每項名稱,一般是一行一行賦值給{},可以用{}代替。-I 必須指定替換字符 -i 是否指定替換字符-可選
      • -d delim 分隔符,argument的分隔符是空格
      • -r 無參數時,停止 xargs
  • 示例
    • find / -type f -print | xargs grep "device“
    • find ./ -name "*.log" | xargs -i cp {} ./a/

grep

  • grep(全局正則表達式版本)允許對文本文件進行模式查找。如果找到匹配模式, grep打印包含模式的所有行。
    grep支持基本正則表達式,也支持其擴展集。 grep [選項] 基本正則表達式 [文件]
  • 常用的 grep選項有:
    • -c 只輸出匹配行的計數。
    • -i 不區分大小寫(只適用於單字符)。
    • -h 查詢多文件時不顯示文件名。
    • -l 查詢多文件時只輸出包含匹配字符的文件名。
    • -n 顯示匹配行及行號。
    • -s 不顯示不存在或無匹配文本的錯誤信息。
    • -v 顯示不包含匹配文本的所有行。
    • -w 完整匹配
  • 示例
    • grep 'Time' load_ml.log
    • grep -c 'Time' load_ml.log
    • grep -v 'Time' load_ml.log
    • grep '2014-10-[1-8]' load_ml.log
    • grep '^[^2014]' load_ml.log
    • grep 'sql\{2,\}' load_ml.log
    • grep '^$' load_ml.log
    • ls -l | grep '^d‘
    • ps -ef | grep lock

sed

  • sed是一個非交互性文本流編輯器。
  • sed [ 選項] sed命令 輸入文件。
  • 選項
    • n 不打印; sed不寫編輯行到標準輸出,缺省爲打印所有行
    • c 下一命令是編輯命令。使用多項編輯時加入此選項
    • f 如果正在調用 sed腳本文件,使用此選項
    • i 編輯當前文件
  • 使用 sed在文件中定位文本的方式
    • x x爲一行號,如 1
    • x , y 表示行號範圍從 x到y,如 2, 5表示從第 2行到第 5行
    • / pattern / 查詢包含模式的行。例如 / d i s k /或/[a-z]/
    • / pattern / pattern / 查詢包含兩個模式的行。例如 / d i s k / d i s k s /
    • pattern / , x 在給定行號上查詢包含模式的行。如 / r i b b o n / , 3
    • x , / pattern / 通過行號和模式查詢匹配行。 3 . / v d u /
    • x , y ! 查詢不包含指定行號 x和y的行。 1 , 2 !
  • sed常用編輯命令
    • p 打印匹配行
    • d 刪除定位行
    • s 使用替換模式替換相應模式
  • 示例
    • sed -n '1'p load_ml.log
    • sed -n '/Time/'p load_ml.log
    • sed -i 's/424.58s/124.53s/g' load_ml.log

awk

  • 如果要格式化報文或從一個大的文本文件中抽取數據包,那麼awk可以完成這些任務
  • 操作符
    • = += *= / = %= ^ = 賦值操作符
    • ? 條件表達操作符
    • || && ! 並、與、非
    • ~! ~ 匹配操作符,包括匹配和不匹配
    • < <= == != >> 關係操作符
    • ++- - 前綴和後綴
  • 內置變量
    • ARGC 命令行參數個數
    • ARGV 命令行參數排列
    • ENVIRON 支持隊列中系統環境變量的使用
    • FILENAME a w k瀏覽的文件名
    • FNR 瀏覽文件的記錄數
    • FS 設置輸入域分隔符,等價於命令行 - F選項
    • NF 瀏覽記錄的域個數
    • NR 已讀的記錄數
    • ORS 輸出記錄分隔符
    • RS 控制記錄分隔符
  • 內置字符串函數
    • gsub(r,s) 在整個$0中用s替代
    • rgsub(r,s,t) 在整個t中用s替代r
    • index(s,t) 返回s中字符串t的第一位置
    • length(s) 返回s長度
    • match(s,r) 測試s是否包含匹配r的字符串
    • split(s,a,fs) 在fs上將s分成序列
    • asprint(fmt,exp) 返回經fmt格式化後的
    • expsub(r,s) 用$0中最左邊最長的子串代替s
    • substr(s,p) 返回字符串s中從p開始的後綴部分
    • substr(s,p,n) 返回字符串s中從p開始長度爲n的後綴部分
  • 示例

    • 列出目錄下的文件及總大小

      ls -l | awk ' /^[^d]/ {print $9"\t"$5} {tot+=$5} END {print tot}'

    • 模糊匹配

      awk -F"|" '{if($1~/s_gn_/)s+=$5} END {print s}' load_analyze_2014-12-07.log

    • 內置變量

      awk -F"/" '{print NF, NR, $0} END {print FILENAME}' url.txt

    • 數字計算

      awk -F"|" '{$5=$5/1024/1024;print $1"\t"$5}' load_analyze_2014-12-07.log

    • Substr

      [hadoop@centos6 log]$ str="1234567"
      [hadoop@centos6 log]$ echo $str | awk '{print substr($str, 1,5)}‘

    • 殺掉進程

      ps -ef | grep dispatch_day.sh | awk '{print $2}' | xargs kill -9

其他命令

  • sort
    • 對文本進行排序
    • 常用選項
      • -t 域分隔符
      • -k 域編號
      • -n 按數字排序
      • -r 倒序
    • 示例
      • sort -t"|" -k 5 -n -r load_analyze_2014-12-07.log
  • uniq
    • 用來從一個文本文件中去除或禁止重複行。一般 u n i q假定文件已分類,並且結果正確。
    • 常用選項
      • -u 只顯示不重複行
      • -d 只顯示有重複數據行,每種重複行只顯示其中一行
      • -c 打印每一重複行出現次數。
      • -f n爲數字,前 n個域被忽略。
    • 示例
      • awk -F"|" '{print $1"|"$5}' load_analyze_2014-12-07.log > a.log
      • uniq -c a.log
  • join
    • 用來將來自兩個分類文本文件的行連在一起。
    • 常用選項
      • -o n.m n 爲文件號, m爲域號。 1 . 3 表示只顯示文件 1 第三域,每個 n, m必須用逗號分隔,如1 . 3, 2 . 1 。
      • -j n m n爲文件號, m爲域號。使用其他域做連接域。
      • -t 域分隔符。用來設置非空格或 t a b鍵的域分隔符
    • 示例
      • join -j1 1 -j2 1 -t"|" a.log b.log
  • cut
    • 從標準輸入或文本文件中剪切列或域
    • 選項
      • -c list 指定剪切字符數。 -c 1, 5-7 剪切第 1 個字符,然後是第 5到第7個字符。
      • -f field 指定剪切域數。 -f1,10-12 剪切第1域,第 1 0域到第 1 2域。
      • -d 指定與空格和 tab鍵不同的域分隔符
    • 示例
      • echo load_analyze_2014-12-07.log | cut -d “_” -f 1 | cut -c1-3
  • split
    • 將大文件分割成小文件
    • 選項
      • -output_file-size 行數,默認1000
    • 示例
      • split -4000 a.log
  • curl
    • 一個功能強大的網絡工具,它能夠通過http、ftp等方式下載文件,也能夠上傳文件。
    • 常用選項
      • -d/–data HTTP POST方式傳送數據
      • -x/–proxy 指定代理服務器地址和端口,端口默認爲1080
      • -O:按照服務器上的文件名,自動存在本地
      • -T/–upload-file 上傳文件
      • -u/–user 設置服務器的用戶和密碼
    • 示例

基礎編程

  • 條件測試
    • 表達式 [ condition ]
    • 文件狀態
      • -d 目錄
      • -s 文件長度大於 0、非空
      • -f 正規文件
      • -w 可寫
      • -L 符號連接
      • -u 文件有 suid位設置
      • -r 可讀
      • -x 可執行
    • 邏輯操作符
      • -a 邏輯與
      • -o 邏輯或
      • ! 邏輯否
    • 字符串比較
      • == 兩個字符串相等。
      • != 兩個字符串不等。
      • -z 空串。
      • -n 非空串。
    • 數字比較
      • -eq 數值相等。
      • -ne 數值不相等。
      • -gt 第一個數大於第二個數。
      • -lt 第一個數小於第二個數。
      • -le 第一個數小於等於第二個數。
      • -ge 第一個數大於等於第二個數
  • 控制流
    • If then else
    • case
    • for
    • until
    • While
    • Break and continue

Shell函數

  • 函數必須放在腳本主體前面
  • 函數通過return 或者echo返回值
  • 函數文件必須是完整路徑
  • 示例
mv_log () {
    file=$1
    file_name=`echo $file | awk -F"," '{print $1}'`
    size=`echo $file | awk -F"," '{print $2}'`
    before_size=`cat $tmp_file | grep -w $file_name | awk -F"," '{print $2}'`
    if [ "$before_size" == "$size" ]
    then
        mv $file_name $dest_dir/${file_name} -f &
    else
        echo $file_name","$size >> $before_file
    fi
}

與其他配合

  • 多進程
    • 調用的函數或者命令後加 &
    • wait 等待後臺進程結束
  • FTP
open 10.95.3.133
user $user $password
bin
cd pub #必須先cd,然後獲取
get zlib-devel-1.2.3-29.el6.x86_64.rpm
quit
EOF``` 

#數據庫
/opt/gcluster/server/bin/gbase -h$db_host -u$db_user -p$db_passwd -vvv -e "use $db_name; call p_g_dispatch_day('$data_time');" 

參考資料

發佈了42 篇原創文章 · 獲贊 29 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章