1. 程式人生 > >Linux基礎(五)

Linux基礎(五)

Linux基礎(五)

1.常見的shell命令
  1.管道命令
   利用linux所提供的管道符"|"將兩個命令隔開,管道符左邊命令的輸出就作為管道符右邊命令輸入
   eg:ls -al|grep Music
  2.find命令
   在一個目錄(子目錄)中搜索檔案,可以指定一些匹配條件,按檔名,檔案型別,使用者甚至是時間戳查詢檔案
   命令格式:
    find [path] [-option]
    -path:find命令所查詢的目錄路徑
    -print:將匹配的檔案輸出到標準輸出
    -size:匹配檔案大小
     find ./ -size 0 顯示檔案大小為0的檔案
    -name 按照檔名查詢檔案
     find /-name demo 在/目錄及其子目錄下查詢名字為demo檔案
    -perm 按照檔案許可權來查詢檔案
     find . -perm 755 [-print]
    -uer 按照檔案所有這來查詢檔案
     find ~ -user root [-print] 在~home目錄中查詢檔案愛呢屬主為root的檔案
    -group 按照檔案所屬組來查詢檔案
     find / -group root [-print] 在/目錄下查詢屬於root使用者組的檔案
    -mtime -n +n
     按照檔案的更改時間來查詢檔案,-n表示更改時間距現在n天以內,+n表示檔案更改時間距現在n天以前
     find / -mtime -5 -print 在系統根目錄下查詢更改時間在5日以內的檔案
     find / -mtime +3 -print 在/目錄下查詢更改時間在3日以前的檔案
    -nogroup 查詢無有效所屬組的檔案,即該檔案所屬的組在/etc/grouops中不存在
     find / -nogroup -print
    -type 查詢某一型別的檔案
     b 塊裝置檔案
     d 目錄
     c 字元裝置檔案
     p 管道檔案
     l 符號連結檔案
     f 普通檔案
      find /etc -type d -print 在/ect下查詢所有的目錄
      find . ! -type d -print 在當前目錄下查詢目錄以外的所有型別的檔案
      find /etc -type | -print 在/etc目錄下查詢所有的符號連結檔案
     -size n:[c] 查詢檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計
     find . -size +1000c -print 在當前目錄下查詢檔案長度大於1000位元組的檔案
     find -name “20180921.txt” | xargs grep “2639090”
  3.sed命令
   非互動式文字處理工具
   sed [option] [action] [filename]
   option:
    h或–help 顯示幫助
    n僅顯示script處理後的結果
    V或-version 顯示版本資訊
    e 允許輸入資料應用多條sed命令進行編輯
    f 直接將sed的動作寫在一個檔案內 -f filename則可以執行 filename內的sed動作
    sed 之action
     s 字串替換
     i 插入
     d 刪除
     a 追加
     c 替換
     p 列印指定的輸出行
     eg: 建立:demo.txt
     sed “s/wuxinhadoop/hadoop/g” demo.txt
      s 表示替換命令
      /wuxinhadoop/表示匹配wuxinhadoop
      /hadoop/表示把匹配替換成hadoop
      /g 表示一行上的替換所有匹配
     如果要寫回檔案可以使用重定向
      sed “s/wuxinhadoop/hadoop/g” demo.txt > demo2.txt
     如果想修改原始檔內容使用引數 -i
      sed -i “s/wuxinhadoop/hadoop/g” demo.txt
     只替換三行
      sed “3s/wuxinhadoop/hadoop/g” demo.txt
    替換第一到第二行的文字
     sed “1,2s/wuxinhadoop/hadoop/g” demo.txt
    替換每一行的第一個l
     sed “s/l/L/1” demo.txt
    替換每行第二個l
     sed “s/l/L/2” demo.txt
    替換第一行的第三個及以後的o
     sed “1s/o/O/3g” demo.txt
    多個匹配 如果需要一次替換多個模式
     第一種方式  sed ‘s/l/L/1;s/o/O/3g’ demo.txt
     第二種方式 sed -e ‘s/l/L/1’ -e ‘s/o/O/3g’ demo.txt
    a動作和i動作
     a動作就是append i動作就是Insert 它們是用來新增行的
     使用n i 新增一行,在第一行新增
     sed “1 i hi word” demo.txt
     使用n a 追加一行,在第一行後面追加
     d 動作刪除匹配行  sed “/hdfs/d” demo.txt
   4.grep命令 全面搜尋正則表示式並把行打印出來
     grep [options] pattern [file]
      -n 同時顯示匹配行上下的n行
      grep -2 pattern filename同時顯示匹配行的上下2行
     grep 
      -b --byte-offset 列印匹配行前面列印改行所在的塊號碼
      -c --count 只打印匹配的行數,不顯示匹配的內容
      -f File,–file=File 從檔案中提取模板,空檔案中包含0個模板,所以什麼都不匹配
      -h --no-filename 當搜尋多個檔案時,不顯匹配檔名字首
      -i --ignore-case 忽略大小寫差別
      -q --qiuet 取消顯示,只返回退出狀態,0則表示找到了匹配的行
      -n --line-number 在匹配的行前面列印行號
      -v --revert-match 反檢索,只顯示不匹配的行
   5.tail命令 把某個檔案檔案的最後幾行顯示到終端上,如果該檔案有更新,tail會自動重新整理,確保看到最新的檔案內容
    tail [-F] [-c Number| -n Number |-m Number|-b Number|-k Number][File]
    -F 該引數用於監視File檔案增長
    -c Number從Number 位元組位置讀取指定檔案
    -n Number 從Number 行位置讀取指定檔案
    -m Number 從Number 字元位置讀取指定檔案,比如檔案中包含中文字,如果指定-c引數可能導致截斷,但使用-m則會避免該問題
    -b Number 表示的512位元組塊位置讀取指定檔案
    -k Number 表示1KB塊位置讀取指定檔案
    file 指定操作的目標檔名
    當涉及到number 如果不指定,預設顯示10行,Number前面可使用正負號,表示該偏移從頂部還是尾部開始計算
    eg:
     tail -F filename
     tail -n 20 finame 顯示filename最後20行
     tail -n +20 filename 不包含前19行,從第20行開始顯示
   6.sort 預設情況下按照字元排序
    -n 按照數值排序
    -u 不出現重複的行
    -t 指定分段的符號
    -k 指定的第幾個段
    -r 逆向排序
    sort -r demo > d1
    sort -t “.” -k 4 demo 對檔案進行指定分隔符,並對第四個欄位排序
   7.cut 負責剪下資料用的
    cut [-option] filename
     -b 位元組
     -c 字元
     -f 要提取第幾列
     -d 按指定分隔符分隔列
     cut -b 2 demo 每一行第二個位元組
     cut -b 5-7 demo 每一行第五個到第七個位元組
     cut -b 9- demo 第九個位元組之後
     cut -b -9 demo 第九個位元組之前
     cut -d . -f 2 demo 以點為分隔符獲取第二個欄位
     cut -d . -f 1 demo 以點為分隔符獲取第一個欄位
   8.history 顯示執行過的命令
    history 5 顯示執行過的上5條命令
    !! 執行上一條命令
    !88 /test 執行第88條命令並子啊命令後面加上/test
    !ls 執行上一個ls命令
    !ls:s/CF/l 執行上一個ls命令,其中把CF替換成l
    fc 編輯並執行上一個歷史命令
    fc 66 編輯並執行第66個歷史命令
    fc -e /usr/bin/vim 66 使用vim 編輯第66個命令並執行
    搜尋歷史命令
     使用ctrl+r搜尋 歷史中的字串,重換ctrl+r可以在歷史命令列表中不斷的向前搜尋包含字串的命令,回車就會執行查詢的命令
    清空歷史命令 history -c
二、shell高階


  1.注意事項
   1.命令的執行是從上而下,從左而右執行
   2.空白行也被忽略掉,tab被視為空格
   3.如果讀取一個enter符號(CR),就嘗試開始執行該命令
   4.#後面內容為註釋
  2.執行指令碼三種方式
   1.直接執行 ./shell.sh 必須具備可執行許可權
   2.source 執行 source shell.sh
   3.bash執行 bash shell.sh
   sh shell.sh
  3.數值運算
   格式:$((運算內容))

	#!/bin/bash 
	 User inputs 2  integer numbers; program will cross these two 
	 read -p "first number: " num1
	 read -p "second number: " num2 
	 total=$(($num1*$num2)) 
	 echo -e "\nThe result of $num1  x $num2  is  ==> $total"
	 exit 0

4.test判斷命令
    test -e demo.txt
     -e 該檔案是否存在
     -f 該檔案是否存在且為檔案(file)
     -d 該檔名是否存在且為目錄(directory)
     -b 該檔案是否存在且為一個block device裝置
     -c 該檔案是否存在且為一個character device裝置
     -S 該檔案是否存在且為一個 Socket檔案
     -p 該檔案是否存在且為一個 FIFO檔案
     -L 該檔案是否存在且為一個連結檔案
    判斷檔案許可權
     -r 檢查該檔案是否存在且具有可讀許可權
     -w 檢查該檔案是否存在且具有可寫許可權
     -x 檢查該檔案是否存在且具有可執行許可權
     -s 檢查該檔案是否存在且為非空檔案
     -u 檢查該檔案是否存在且具有SUID的屬性
     -g 檢查該檔案是否存在且具有SGID的屬性
    判斷字串
     test -z String 判斷字串是否為空?若string為空字串則為true
     test -n string 判斷字串是否為空?若string為空字串則為false
     test str1=str2 或 == 判斷str1是否等於str2 若相等,則返回true
     test str1!=str2 判斷str1 是否不等於str2若相等,則返回false
    兩個檔案之間比較
     -nt 判斷file1 是否比file2 新
     -ot 判斷file1 是否比 file2 舊
     -ef 判斷兩個檔案是否為同一個檔案
    5.判斷符號[]基本和test相同
     1. !=和等等於用於比較字串
     2.整數比較只能使用-eq,-gt,ge,lt,le這種形式
     3.[]中的邏輯與和邏輯或使用-a和-o 表示
     4.&&,||,<和>操作符如果出現在[]結構中的話會報錯
    6.shell script引數
     /path/to/scriptname arg1 arg2 arg3 arg4
        $0     $1  $2  $3  $4
     -$0 代表指令碼程式本身
     -$1,$2…代表後面的第一個引數 第二個引數 等等
     - $ # 代表後接的引數個數,以上邊為例,這裡顯示為4
     - $ @ 代表 “$1” “$2” “$3” “$4"每個變數是獨立的
     - $ * 代表”$1 $2 $3 $4"
     功能
       0

            0 程式檔名         # 共有幾個引數
       若引數的個數小於(lt)2則告知使用者引數數量太少
       全部引數內容是什麼 $ @
        第一個引數 $1
        第二個引數 $2
        shift 造成引數變數號碼偏移
    7.條件判斷語句
       if [條件判斷]
      then
      //命令
     fi
     if[條件判斷]; then 條件成立執行,命令;
     fi 將if 反過來寫就成為fi 結束if語句
     2.雙分支結構
      if [ 條件1 ]; then 條件一成立執行,指令集1
      else 條件1不成立執行指令集2 fi
     3.多分支結構
      if [ 條件1 ]; then 條件1成立,執行指令1
      elif [ 條件2 ]; then 條件2成立 執行指令集2
      else 條件都不成立 執行指令集3 fi
     4.case結構條件語句
      case $變數名稱 in “值1”)
      程式段1
      ;;
      “值2”)
      程式段2
      ;;
      *)
       exit 1
       ;;
       esac
      eg:

		#!/bin/bash
		read -p "please input a int ([1,7])": num
		case $num in 1)
		  echo "Mon"
		;;
		2)
		  echo "Tue"
		;;
		3)
		  echo "Wed"
		;;
		4)
		  echo "Thu"
		;;
		5)
		  echo "Fir"
		;;
		[6-7])
		 echo "weekday"
		;;
		*)
		 echo "input [1,7]"
		 exit 1
		esac
		exit 0

8.函式
    function fname(){
     命令
    }
   9.shell script
    sh [-nx] scirpt.sh
    -n 不執行script 僅查詢語法問題
    -v 在執行script前,先將script 的內容輸出到螢幕上
    -x 將使用到的script內容顯示到螢幕上,這是很有用的引數!!
   10.迴圈語句
    1.不定迴圈
     while do done,until do done
    2.固定迴圈
     for … do done
    3.while
     while [ condition ] ; do 
     命令 
     done
     或者 
     while [ condition ]
     do
     命令
     done
    4.until
     util [ condition ];do
     命令
     done
     或者
     until [ condition ]
     do
     命令
     done
    eg:

		#!/bin/bash
		i=0
		until [ $i -gt 5 ]
		  do
		  let square=i*i
		  echo "$i*$i=$square"
		  let i++
		done

5.for迴圈
    for…do…done迴圈
    語法
     for 變數名 in 變數取值列表
     do
     命令
     done
     提示:在此結構中"in變數取值列表"可省略,省略時相當乣使用for i in “[email protected]
     輸出1-5:

	1.for迴圈
      for num in 5 4 3 2 1
      do
      echo $num
      done

2.大括號方法
     echo {1…5}
    3.使用seq -s 分隔符 起始 不長 終點
     seq -s " " 5 -1 1
     4.課件分發

		vim send.sh
		#!/bin/bash
		for ip in `cat /root/ips.txt`
		do
		scp/root/epel.rpm [email protected]${ip}:/root
		Done
		esc:->wq->chmod777 send.sh
		檔案ips.txt內容:
		192.168.80.10
		192.168.80.90

11.定時任務
   分 小時 日 月 星期 命令
   10 0-23 1-31 1-12 0-6 command(取值範圍,0表示週日一般一樣對應一個任務)
   幾個特殊符號的含義:
    "*"代表取值範圍內的數字
    "/“代表"每”
    "-"代表從某個數字到某個數字
    “,” 分開幾個離散的數字
    eg:
     */1 * * * * root /home/day05/sh/send.sh
    如果沒有生效,解決辦法:首先得確定,指令碼寫的是否正確,shell指令碼是否擁有執行許可權。一切正常還不能執行的話,就用以下方法:使root使用者的crontab生效 crontab-u root /var/spool/cron/root
    重啟crontab服務 service crondrestart
    crontab -l 檢視定時任務
    crontab -e 編輯定時任務
   命令引數:
    -u user:用來設定某個使用者的crontab服務,例如,“-u ixdba”表示設定ixdba使用者的crontab服務,此引數一般有root使用者來執行。
    file:file是命令檔案的名字,表示將file做為crontab的任務列表檔案並載入crontab。如果在命令列中沒有指定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。
    -e:編輯某個使用者的crontab檔案內容。如果不指定使用者,則表示編輯當前使用者的crontab檔案。
    -l:顯示某個使用者的crontab檔案內容,如果不指定使用者,則表示顯示當前使用者的crontab檔案內容。
    -r:從/var/spool/cron目錄中刪除某個使用者的crontab檔案,如果不指定使用者,則預設刪除當前使用者的crontab檔案。
    -i:在刪除使用者的crontab檔案時給確認提示。