Shell 常用語(yǔ)句查詢(xún)

<font color=blue >目錄</font>

[TOC]


<font color=blue>工作常用</font>

df -TH  //查看磁盤(pán)大小介褥,解決:刪除比較大無(wú)用的文件
df -i  //查看inode:文件的字節(jié)數(shù)绑谣,擁有者id键痛,組id消恍,權(quán)限,改動(dòng)時(shí)間解滓,鏈接數(shù)穗酥,數(shù)據(jù)block的位置瞬浓,解決:刪除數(shù)量過(guò)多的小文件
du -h --max-depth=1  //Linux中查看各文件夾大小命令
  • linux下查看當(dāng)前用戶(hù)的 三個(gè)命令
1,whoami;

2,id -un;

3,who -H  可以列出當(dāng)前所有的    NAME (用戶(hù)名)    LINE (窗口列表)    TIME(開(kāi)啟時(shí)間)     COMMENT(目錄層次)

 (注:who 顯示當(dāng)前在線(xiàn)用戶(hù),加-H顯示上邊紅字一欄机打,并且與下邊信息對(duì)應(yīng))

比如:

[root@static-192-165-1-222 home]# who -H
NAME LINE TIME  COMMENT
home tty1 2016-06-30 14:28 (:0)
home pts/0 2016-07-01 10:12 (:0.0)
home pts/1 2016-07-01 11:33 (:0.0)
home pts/2 2016-07-04 18:13 (:0.0)

 

在linux下是對(duì)應(yīng)的矫户!下文將    介紹useradd 與usermod 中將敘述部分相關(guān)命令.

---------------------------------->人生猶如負(fù)重致遠(yuǎn),不可急于求成残邀。 自律使人自由皆辽!

<font color=blue>【菜鳥(niǎo)教程】常用語(yǔ)句和命令</font>


<font color=blue>Bash shell基本命令</font>

<font color=#FF00FF>添加環(huán)境變量</font>

例如要將/home/rongdeguo/Code 加入到環(huán)境變量中,可以在shell中輸入

export PATH=$PATH:/home/rongdeguo/Code

然后查看環(huán)境變量芥挣。

echo $PATH //查看PATH變量

set //查看當(dāng)前的環(huán)境變量

刪除環(huán)境變量使用unset驱闷。

unset lx //刪除環(huán)境變量lx

<font color=Maroon> Bash手冊(cè)</font>

  • Man命令用來(lái)訪(fǎng)問(wèn)存儲(chǔ)在Linux系統(tǒng)上的手冊(cè)頁(yè)面。
    • Eg: man ls
  • Info頁(yè)面信息
  • -help or --help

<font color=Maroon> pwd命令</font>

  • pwd命令顯示當(dāng)前目錄空免。

<font color=Maroon> cd命令</font>

  • cd命令在Linux系統(tǒng)中 切換目錄空另;
    • 單點(diǎn)符(.),表示當(dāng)前目錄蹋砚;

    • 雙點(diǎn)符(..)扼菠,表示當(dāng)前目錄的父目錄;

    • (/), 表示進(jìn)入系統(tǒng)根目錄,上面命令執(zhí)行完后拿ls命令看一下坝咐,當(dāng)前目錄已經(jīng)到系統(tǒng)根目錄了

    • cd ~ 進(jìn)入當(dāng)前用戶(hù)的家目錄

    • cd 跟"cd ~"命令相同循榆,都為進(jìn)入當(dāng)前用戶(hù)的家目錄

    • cd - 進(jìn)入上次所在的目錄

<font color=Maroon> ls/l命令</font>

  • ls命令列出當(dāng)前目錄中的文件和子目錄。Ls命令有很多參數(shù)可以定制輸出內(nèi)容墨坚;
  • l命令長(zhǎng)列表命令秧饮,按文件的時(shí)間排序
  • ll命令長(zhǎng)列表命令,按文件名排序框杜。等價(jià)于"ls -l"
  • 過(guò)濾輸出列表浦楣,Eg:"ll my*"
  • 參數(shù):

    • -F 在目錄后面加(/),方便用戶(hù)分辨目錄咪辱;
    • -a 將以點(diǎn)號(hào)(.)開(kāi)頭的隱藏文件也顯示出來(lái)振劳,默認(rèn)情況是不限制這些文件的;
    • -R 遞歸選項(xiàng)油狂,列出當(dāng)前目錄下包含的子目錄及其包含的文件历恐;
    • -l 長(zhǎng)列表格式輸出寸癌,在每一行列出當(dāng)個(gè)文件或目錄。輸出的第一行顯示了目錄中包含的總塊數(shù)弱贼。
  • linux命令之ll按時(shí)間和大小排序顯示

    # 代碼示例
    ll -Sh       # 按大小排序
    ll -rt       # 按時(shí)間排序
    

<font color=Maroon> touch命令創(chuàng)建文件</font>

  • touch命令可以創(chuàng)建空文件和變更已有文件的訪(fǎng)問(wèn)時(shí)間或修改時(shí)間蒸苇。

<font color=Maroon> cp命令</font>

  • cp命令將已有文件或目錄復(fù)制到其他位置。

Eg: cp source destination
- source 源對(duì)象
- destination 目標(biāo)對(duì)象
-

  • 參數(shù):
    • -i 提示是否真的要文件復(fù)制吮旅;Eg: cp -i source destination

<font color=Maroon> ln命令</font>

  • ln命令可以實(shí)現(xiàn)文件鏈接溪烤,即在兩個(gè)位置上擁有同一個(gè)文件且不用生成單獨(dú)的副本。

<font color=Maroon> mv命令實(shí)現(xiàn)文件重命名庇勃,在Linux中也稱(chēng)為移動(dòng)文件</font>

-- 重命名
mv source_file target_file

-- 重命名文件
mv user_image_monthly.txt user_image_monthly_20191113.txt

-- 移動(dòng)文件(schedule_file是文件夾名)
mv user_image_monthly_20191113.txt schedule_file

<font color=Maroon> mkdir命令</font>

  • mkdir創(chuàng)建一個(gè)新的目錄檬嘀,即文件夾。

<font color=Maroon> rm/rmdir命令</font>

  • rm命令刪除文件责嚷,在Linux中也稱(chēng)為移除文件鸳兽。
    • rm -rf file/dir // 不要詢(xún)問(wèn),遞歸刪除
  • Rmdir命令刪除目錄罕拂,即文件夾揍异。

<font color=Maroon> find命令</font>

  • find -name 文件名:查找文件

<font color=Maroon> file命令</font>

  • File命令查看文件類(lèi)型。

<font color=Maroon> cat命令</font>

  • Cat命令顯示文本文件的所有內(nèi)容爆班。
  • 參數(shù):
    • -n 給所有行加行號(hào)衷掷;
    • -b 只給有文本的行加行號(hào);
    • -T 用^I字符組合替換文中的所有制表符蛋济;

<font color=Maroon> more命令</font>

  • more命令顯示分頁(yè)文本文件的內(nèi)容棍鳖。
  • Eg: more file_name #顯示文件的前面一部分內(nèi)容

<font color=Maroon> less命令</font>

  • less命令( less is more )顯示分頁(yè)文本文件的內(nèi)容,并且能識(shí)別上下鍵翻頁(yè)碗旅。

<font color=Maroon> tail命令</font>

  • Tail命令顯示文件最后幾行內(nèi)容渡处,默認(rèn)情況顯示末尾10行。
  • 參數(shù):
    • -n 控制顯示的行數(shù)祟辟;
    • Eg: tail -n 20 file_name #顯示文件的后20行

<font color=Maroon> head命令</font>

  • head命令顯示文件開(kāi)頭幾行內(nèi)容医瘫,默認(rèn)情況顯示前10行。

<font color=Maroon> vi/vim命令</font>

  • vi/vim命令編輯文件
    • i 進(jìn)入插入模式
    • "Esc"按鍵退出插入模式
    • :q 未修改退出
    • !q 強(qiáng)制退出
    • :wq 保存修改并退出
  • vim的查找功能
    vim是一款強(qiáng)大的編輯器旧困。在vim下要查找字符串醇份。
一,全匹配:

1吼具,從上往下查找僚纷,比如“string” :   /string

2,從下往上查找拗盒,比如“string” : ?string 

 

二怖竭,模糊匹配(正則表達(dá)式)

1,. :通配1個(gè)字符 陡蝇,如 匹配 server, 可以用  /se...r

2痊臭,* :通配多個(gè)字符哮肚,如 匹配 privilege,可以用 p*ge

 

三广匙,快速查找


1允趟, Shift + * :讓光標(biāo)停留在想要查找的單詞的任意一個(gè)字母上面, 然后輸入 Shift + * 鸦致,即可快速選中該單詞潮剪,并且通過(guò) n  或  N 進(jìn)行上一個(gè)或下一個(gè)的匹配。

2蹋凝,yw :讓光標(biāo)停留在單詞的第一個(gè)字母上鲁纠, 然后輸入yw拷貝該單詞, 然后輸入 / (Ctrl + R) 0 (即 /”0)鳍寂,回車(chē), 就查找到了第一個(gè)匹配的單詞情龄, 并且通過(guò) n  或  N 進(jìn)行上一個(gè)或下一個(gè)的匹配迄汛。

<font color=Maroon> chomd命令</font>

  • chomd命令改變文件權(quán)限
    • Eg: chomd +x file_name #賦予文件屬主執(zhí)行文件的權(quán)限

<font color=Maroon> 文件的上傳/下載</font>

  • rz XXXXX.txt 上傳
  • rz -y XXXXX.txt 覆蓋上傳
  • sz XXXXX.txt 下載

<font color=Maroon> Linux下文件(文件夾)的壓縮和解壓</font>

https://baijiahao.baidu.com/s?id=1640987338729787489&wfr=spider&for=pc

  1. zip命令

例如:zip -r mysql.zip mysql 該句命令的含義是:將mysql文件夾壓縮成mysql.zip

zip -r abcdef.zip abc def.txt 這句命令的意思是將文件夾abc和文件def.txt壓縮成一個(gè)壓縮包abcdef.zip

  • unzip命令

與zip命令相反,這是解壓命令骤视,用起來(lái)很簡(jiǎn)單鞍爱。 如:unzip mysql.zip 在當(dāng)前目錄下直接解壓mysql.zip。

  • tar命令

例如:tar -cvf 123.tar file1 file2 dir1 該句命令實(shí)現(xiàn)一個(gè)tar壓縮专酗,它是將兩個(gè)文件(file1和file2)和一個(gè)文件夾(dir1)壓縮成一個(gè)123.tar文件睹逃。

tar -zxvf apache-tomcat-7.0.75.tar.gz 該命令在解壓安裝tomcat時(shí)使用,是將apache-tomcat.7.0.75.tar.gz直接解壓到當(dāng)前目錄下祷肯。tar同時(shí)具有壓縮的解壓的功能沉填,使用時(shí)根據(jù)參數(shù)和命令結(jié)構(gòu)區(qū)分。


<font color=#FF00FF>字符串操作</font>

<font color=Maroon> 拼接字符串</font>

<pre>
your_name="runoob"

使用雙引號(hào)拼接

greeting="hello, "your_name" !" greeting_1="hello,{your_name} !"
echo greetinggreeting_1

使用單引號(hào)拼接

greeting_2='hello, 'your_name' !' greeting_3='hello,{your_name} !'
echo greeting_2greeting_3
</pre>

<font color=Maroon> 截取字符串</font>

測(cè)試字符串
etl_date="2019-03-01-00-00"

  • 使用#截取"-"之后的內(nèi)容

  • 使用%截取"-"之前的內(nèi)容

符號(hào) 方向 前后字符串
#*- 從左往右 \to 找第一個(gè)字符‘-’ 截取字符‘-’之后的字符串
%%*- 從左往右 \to 找第一個(gè)字符‘-’ 之前
##*- 從右往左 \leftarrow 找第一個(gè)字符‘- 之后的字符串
%*- 從右往左 \leftarrow 找第一個(gè)字符‘- 之前
格式 說(shuō)明
$${string: start :length}$ 從 string 字符串的左邊第 start 個(gè)字符開(kāi)始佑笋,向右截取 length 個(gè)字符翼闹。
${string: start} 從 string 字符串的左邊第 start 個(gè)字符開(kāi)始截取,直到最后蒋纬。
${string: 0-start :length} 從 string 字符串的右邊第 start 個(gè)字符開(kāi)始猎荠,向右截取 length 個(gè)字符。
${string: 0-start} 從 string 字符串的右邊第 start 個(gè)字符開(kāi)始截取蜀备,直到最后关摇。
${string#*chars} 從 string 字符串第一次出現(xiàn) *chars 的位置開(kāi)始,截取 *chars 右邊的所有字符碾阁。
${string##*chars} 從 string 字符串最后一次出現(xiàn) *chars 的位置開(kāi)始输虱,截取 *chars 右邊的所有字符。
${string%*chars} 從 string 字符串第一次出現(xiàn) *chars 的位置開(kāi)始瓷蛙,截取 *chars 左邊的所有字符悼瓮。
${string%%*chars} 從 string 字符串最后一次出現(xiàn) *chars 的位置開(kāi)始戈毒,截取 *chars 左邊的所有字符。
  • https://www.cnblogs.com/zwgblog/p/6031256.html
    <pre>
    first_day={etl_date:9} #左邊第10個(gè)字符開(kāi)始横堡,一直到結(jié)束(從0開(kāi)始) month={etl_date:0-10:7} #從右邊第10個(gè)字符開(kāi)始埋市,截取7個(gè)字符
    echo {var:0:5} #從左邊第幾個(gè)字符開(kāi)始,及字符的個(gè)數(shù) echo{var:0-7} #從右邊第7個(gè)字符開(kāi)始命贴,一直到結(jié)束道宅。
    注:(左邊的第一個(gè)字符是用 0 表示,右邊的第一個(gè)字符用 0-1 表示)
    </pre>

<font color=Maroon> Shell使用date對(duì)輸入時(shí)間進(jìn)行加減</font>

  • date +%Y-%m-%d #今天

  • date "+%Y-%m-%d %H:%M:%S" #帶時(shí)間的格式

  • date -d "-1 day" +%Y-%m-%d #昨天

  • date -d "+1 day" +%Y-%m-%d #明天

  • 指定日期上加減

firstday='2019-01-01'


#加減一天

echo (date -d "firstday 1 day" +%Y-%m-%d)

echo date -d "$firstday -1 day" +%Y-%m-%d


#加減一周

echo date -d "$firstday-1 week " +%Y-%m-%d

echo date -d "$firstday+1 week " +%Y-%m-%d


#加減一月

echo date -d "$firstday-1 month " +%Y-%m-%d

echo date -d "$firstday+1 month " +%Y-%m-%d


#加減一年

echo date -d "$firstday-1 year " +%Y-%m-%d

echo date -d "$firstday+1 year " +%Y-%m-%d

<font color=Maroon> 字符串替換的實(shí)現(xiàn)</font>

  • 方法一:推薦使用胸蛛,方便
    <pre>
    maxTime="2020-04-28"
    echo {maxTime/'-'/'_'} # 替換一次 echo{maxTime//'-'/'_'} # 雙斜杠替換所有匹配
    </pre>
  • 方法二:字符串替換tr實(shí)現(xiàn)
string="2020-03-22"  
echo $string | tr '-' '_'
>>2020_03_22

echo $string | tr '-' "" #報(bào)錯(cuò)tr: when not truncating set1, string2 must be non-empty
function check(){
    local a="$1"
    printf "%d" "$a" &>/dev/null && echo "integer" && return
    printf "%d" "$(echo $a|sed 's/^[+-]\?0\+//')" &>/dev/null && echo "integer" && return
    printf "%f" "$a" &>/dev/null && echo "number" && return
    [ ${#a} -eq 1 ] && echo "char" && return
    echo "string"
}

<font color=#FFOOFF>常用函數(shù)變量</font>

<mark>注意:在變量污茵、等號(hào)=和值之間不能出現(xiàn)空格</mark>

  • yesterday=$(date -d "-1 day" +%Y-%m-%d) #昨天

  • month_max=$(date -d "-1 day" +%Y%m)

  • mytest=(one two three four five) #數(shù)組變量

    • echo(${mytest[2]})
    • echo(${mytest[*]})
  • 計(jì)算日期
    <pre>
    let dth=(date +%d)-1 #當(dāng)天日期號(hào)-1, 整數(shù)運(yùn)算let 不能省 first_day=(date -d " -dth day" +%Y-%m-%d) #本月1號(hào),也可以直接這么獲取更簡(jiǎn)潔:first_day=(date +%Y-%m)+'-01'
    etl_day=(date -d "first_day -1 day" +%Y-%m-%d) #上月最后一天
    last_month={etl_day:0-10:7} #上月月份 echoetl_day ,$last_month
    </pre>

  • echo 轉(zhuǎn)義符 http://www.zsythink.net/archives/96


<font color=#FF00FF>處理數(shù)據(jù)文件的命令</font>

<font color=Maroon> 排序命令sort</font>


<font color=#FF00FF>Shell 的結(jié)構(gòu)化命令</font>

<font color=Maroon> if語(yǔ)句</font>

  • 語(yǔ)法 ------- P238 --------
    <pre>
    <strong>if</strong> <em>[ condition1 ]</em> #這里的方括號(hào)定義了測(cè)試條件,相當(dāng)于test命令葬项。注意泞当,<mark>"["之后</mark>和<mark>"]"之前</mark>必須加上一個(gè)空格, 判斷符號(hào)前后也一定要有空格。
    <strong>then</strong>
    <em>command set1</em>
    <strong>elif</strong> <em>condition2</em>
    <strong>then</strong>
    <em>command set2</em>
    ......
    <strong>elif</strong> <em>condition(n-1)</em>
    <strong>then</strong>
    <em>command set(n-1)</em>
    <strong>else</strong>
    <em>command setn</em>
    <strong>fi</strong>
    </pre>

  • test命令可以判斷三類(lèi)條件

    • 數(shù)值比較符
數(shù)值比較符 符號(hào)描述 描述
n1 -eq n2 n1 == n2 判斷n1是否等于n2
n1 -ne n2 n1 <> n2 判斷n1是否不等于n2
n1 -ge n2 n1 >= n2 判斷n1是否大于或等于n2
n1 -gt n2 n1 > n2 判斷n1是否大于n2
n1 -le n2 n1 <= n2 判斷n1是否小于或等于n2
n1 -lt n2 n1 <= n2 判斷n1是否小于n2
    • 字符串比較符
字符串比較符 描述
str1 = str2 判斷str1與str2是否相同
str1 != str2 判斷str1與str2是否不同
str1 < str2 判斷str1是否比str2忻裾洹(短)
str1 > str2 判斷str1是否比str2大(長(zhǎng))
-n str1 判斷str1的長(zhǎng)度是否為非0
-z str1 判斷str1的長(zhǎng)度是否為0
- 文件比較
文件比較符 描述
-d file 判斷file是否存在襟士,并且為目錄(文件夾)
-e file 判斷fifile是否存在
-f file 判斷file是否存在,并且是一個(gè)文件
-r file 判斷file是否存在嚷量,并且可讀
-s file 判斷file是否存在陋桂,并且非空
-w file 判斷file是否存在,并且可寫(xiě)
-x file 判斷file是否存在蝶溶,并且可執(zhí)行
-O file 判斷file是否存在嗜历,并且屬于當(dāng)前用戶(hù)
-G file 判斷file是否存在,并且屬于當(dāng)前用戶(hù)組
-L file 判斷file是否存在抖所,并且為符號(hào)鏈接
-h file 判斷file是否存在梨州,并且為軟鏈接
file1 -nt file2 判斷file1是否比f(wàn)ile2新
file1 -ot file2 判斷file1是否比f(wàn)ile2舊
  • 示例
    • 判斷文件夾是否存在
      <pre>
      dir_r="/home/edw/log"

      如果dir_r不存在則創(chuàng)建該文件夾,否則移除該文件夾

      if [ ! -d dir_r ] then mkdirdir_r #mkdir創(chuàng)建文件夾
      else
      rmdir $dir_r #rmdir刪除文件夾
      fi
      </pre>

    • 判斷文件是否存在
      <pre>
      file_r="/home/edw/log/table_list_end.txt"

      如果file_r存在則清空文件內(nèi)容部蛇,否則創(chuàng)建該文件

      if [ -f file_r ] # 注意if后面的[ ... ]一定要有空格 then echo "" >file_r #清空文件內(nèi)容
      else
      touch $file_r #touch創(chuàng)建文件
      fi
      </pre>

<font color=Maroon> for語(yǔ)句</font>

  • 語(yǔ)法
    ------- P260 --------
    <pre>
    <strong>for</strong> <em>var</em> <strong>in</strong> <em>list</em>
    <strong>do</strong>
    <em>commands</em>
    <strong>done</strong>
    </pre>

  • 示例

    • 讀取列表的值:
      <pre>
      for test in Alabama Alaska Arizona Arkansas
      do
      echo the next state is $test
      done
      </pre>

    • 讀取列表中的復(fù)雜值(單引號(hào))
      兩種解決方法:

      • 使用轉(zhuǎn)義符(\)來(lái)將復(fù)雜字符(比如單引號(hào))轉(zhuǎn)義
        <pre>
        for test in I don't know if this'll work
        do
        echo "word:$test"
        done
        </pre>

      • 使用雙引號(hào)來(lái)定義用到單引號(hào)的值
        <pre>
        for test in I don't know if this'll work
        do
        echo "word:$test"
        done
        </pre>

    • 讀取列表中的復(fù)雜值(空格)
      <pre>
      for test in Nevada New Hampshire New Mexico New York North Carolina
      do
      echo "Now going to $test"
      done

    <em>執(zhí)行結(jié)果并不是我們想要的結(jié)果摊唇。因?yàn)閒or命令用空格劃分列表中的每個(gè)值,因此需要將代碼改為:</em>

    for test in Nevada "New Hampshire" "New Mexico" "New York" "North Carolina"
    do
    echo "Now going to $test"
    done
    </pre>

    • 讀取文件中的值
      <pre>
      <em>下面代碼實(shí)現(xiàn)了一段這樣的功能:從table_list.txt中篩選截止當(dāng)前月的表名存放到table_list_end.txt</em>

    file="/home/edw/log/table_list.txt" #存放原表名的列表
    file_r="/home/edw/log/table_list_end.txt" #篩選后的表名列表
    for table_nm in (catfile)
    do
    if [ {table_nm:0-8:6} -lemonth_max ] #當(dāng)文件名中的(倒數(shù)8-2數(shù)字表示文件的月份)小于等于當(dāng)前月month_max時(shí) then echotable_nm>>$file_r
    else
    break
    fi
    done
    </pre>

<font color=Maroon> while語(yǔ)句</font>

  • 語(yǔ)法
    ------- P270 --------
    <pre>
    <strong>while</strong> <em>conditions</em> #當(dāng)conditions條件滿(mǎn)足時(shí)涯鲁,執(zhí)行do--done循環(huán)巷查;直到conditions條件不滿(mǎn)足,才退出do--done循環(huán)
    <strong>do</strong>
    <em>commands</em>
    <strong>done</strong>
    </pre>

  • 示例
    <pre>
    cnt=1
    while [ cnt -le 5 ] do echo "這是第cnt個(gè)epoch"
    cnt=[cnt+1 ]
    done
    </pre>

  • 測(cè)試過(guò)的示例
    <pre>
    nowTime='2019-01-01'
    endTime='2019-01-05'
    while [[ nowTime <endTime ]] # 雙方括號(hào)允許高級(jí)字符串模式匹配運(yùn)算抹腿,但是并不是所有的shell都支持雙方括號(hào)
    do
    echo nowTime nowTime=`date -d "nowTime 1 day" +%Y-%m-%d`
    done
    </pre>

<font color=Maroon> until語(yǔ)句</font>

  • 語(yǔ)法
    ------- P272 --------
    <pre>
    <strong>until</strong> <em>conditions</em> #與while相反岛请,當(dāng)conditions條件不滿(mǎn)足時(shí),執(zhí)行do--done循環(huán)警绩;直到conditions條件滿(mǎn)足崇败,才退出do--done循環(huán)
    <strong>do</strong>
    <em>commands</em>
    <strong>done</strong>
    </pre>

  • 示例
    <pre>
    cnt=1
    while [ cnt -le 5 ] do echo "這是第cnt個(gè)epoch"
    cnt=[cnt+1 ]
    done
    </pre>

<font color=Maroon> 控制循環(huán)語(yǔ)句</font>

  • break命令
    break命令跳出循環(huán),可以用于任意類(lèi)型循環(huán)
    • break n #n指定了跳出的循環(huán)層級(jí);默認(rèn)情況下后室,n=1表示跳出當(dāng)前循環(huán)
  • continue命令
    continue命令可以提前中止某次循環(huán)中的命令缩膝,但是并不會(huì)完全終止整個(gè)循環(huán)
    • continue n #n指定要繼續(xù)的循環(huán)層級(jí);默認(rèn)情況下岸霹,n=1表示跳出當(dāng)前循環(huán)

<font color=blue>Shell 定時(shí)任務(wù)</font>


??Linux系統(tǒng)使用cron程序來(lái)執(zhí)行定時(shí)任務(wù)疾层,cron程序會(huì)在后臺(tái)檢查并運(yùn)行cron時(shí)間表。該文件中每行都包括六個(gè)域贡避,其中前五個(gè)域是指定命令被執(zhí)行的時(shí)間痛黎,最后一個(gè)域是要被執(zhí)行的命令。每個(gè)域之間使用空格或者制表符分隔刮吧。格式如下:

  • minute hour day-of-month month-of-year day-of-week commands

??合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要執(zhí)行的腳本)

??除了數(shù)字還有幾個(gè)個(gè)特殊的符號(hào)就是"*"湖饱、"/"和"-"、","杀捻,*代表所有的取值范圍內(nèi)的數(shù)字井厌,"/"代表每的意思,"/5"表示每5個(gè)單位,"-"代表從某個(gè)數(shù)字到某個(gè)數(shù)字,","分開(kāi)幾個(gè)離散的數(shù)字水醋。

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期幾 (0 - 6) (星期天 為0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一個(gè)月中的第幾天 (1 - 31)
|    +-------------------- 小時(shí) (0 - 23)
+------------------------- 分鐘 (0 - 59)

<font color=Maroon>設(shè)置需要執(zhí)行的腳本P350</font>

新增調(diào)度任務(wù)可用兩種方法:

  1. 在命令行輸入: crontab -e 然后添加相應(yīng)的任務(wù)旗笔,wq存盤(pán)退出。
  2. 直接編輯/etc/crontab 文件拄踪,即vi /etc/crontab,添加相應(yīng)的任務(wù)拳魁。
  • 示例:
* 13 * * * 4  python3 /home/jovyan/work/夢(mèng)楠的數(shù)據(jù)需求_周統(tǒng)計(jì)/mengnan_data.py >> /home/jovyan/work/夢(mèng)楠的數(shù)據(jù)需求_周統(tǒng)計(jì)/mengnan_data.log

0 6 1 * * sh /opt/edw/edw_batch/script/hive/dwd/overdue_num_monthly.sh >> /home/edw/log/overdue_num_monthly_run.log 2>&1 

Linux shell中2>&1的含義解釋:
https://blog.csdn.net/zhaominpro/article/details/82630528

<font color=Maroon>溫馨提示</font>

如果shell腳本執(zhí)行不成功, 可以查看:

  1. 文本權(quán)限 chmod +x filename.sh
  • 確認(rèn)文本格式是fileformat=unix惶桐,而不是fileformat=dos(設(shè)置方法見(jiàn)常見(jiàn)錯(cuò)誤1)

<font color=Maroon>查看調(diào)度任務(wù)</font>

  • crontab -e配置是針對(duì)某個(gè)用戶(hù)的,而編輯/etc/crontab是針對(duì)系統(tǒng)的任務(wù)

  • crontab -l //列出當(dāng)前的所有調(diào)度任務(wù)

  • crontab -l -u jp //列出用戶(hù)jp的所有調(diào)度任務(wù)

<font color=Maroon>刪除任務(wù)調(diào)度工作</font>

  • crontab -r //刪除所有任務(wù)調(diào)度工作

<font color=Maroon>直接編輯 </font>

  • vim /etc/crontab ,默認(rèn)的文件形式如下:

<font color=Maroon> 解決Crontab 獲取/etc/profile中的系統(tǒng)變量的問(wèn)題 </font>

在執(zhí)行Python腳本時(shí)潘懊,獲取/etc/profile中的系統(tǒng)變量(不同平臺(tái)或不同環(huán)境有所區(qū)別)

方式一:直接添加語(yǔ)句

*/1 * * * * source /etc/profile && /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

方式二:使用shell包裹Python腳本

#!/bin/bash
 
source /etc/profile
 
/usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

<font color=blue>Shell 腳本文件</font>

在創(chuàng)建shell腳本文件時(shí)姚糊,必須在文件的第一行指定要使用的shell。格式如下:
<pre> #!/bin/bash</pre>

<font color=#FF00FF>Shell 腳本文件中常用的日期參數(shù)</font>

<pre>
now=(date "+%Y-%m-%d %H:%M:%S") #當(dāng)前時(shí)間 yesterday=(date -d "-1 days" +%Y-%m-%d) #昨天
</pre>

<font color=#FF00FF>Shell 腳本文件中常用語(yǔ)句</font>

<pre>
0:當(dāng)前Shell程序的文件名 dirname0授舟,獲取當(dāng)前Shell程序的路徑
cd dirname $0救恨,進(jìn)入當(dāng)前Shell程序的目錄
</pre>

<font color=#FF00FF>shell腳本獲取hive的查詢(xún)結(jié)果,賦值給變量</font>

<pre>
result=hive -e "select etl_date from $1 where etl_date = '"$yesterday"' limit 1"
echo result </pre> 或者 <pre> result=(hive -e "select etl_date from 1 where etl_date = '"yesterday"' limit 1")
echo $result
</pre>

<font color=#FF00FF>一個(gè)完整的Shell 腳本文件參考</font>

<pre>

#!/bin/bash
# -------------說(shuō)明------------- 
# Filename:  Azkaban_depend_table.sh
# Name : 
# Product : 
# Type :  
# Language : bash shell  
# Date : 2020-03-05  
# Author :cyh
# Modifid_date: 2019-12-19
# Modifid
# Revision:    1.0 
# Description :  略

source /etc/profile
#----------------------------------Define--------------------------------------------------

yesterday=$(date -d "-1 days" +%Y-%m-%d)         #昨天

# --------------------------------- Execute Hive ---------------------------------------------
hive<<EOF
SET mapreduce.job.queuename=big_slow;
SET hive.cli.print.header=TRUE;
set hive.exec.dynamic.partition=true;  
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.jobname.length=10;

----------------------------------- sql語(yǔ)句 ------------------------------------------------
# 寫(xiě)法一:不用shell參數(shù)
# insert into dm_userimage.Azkaban_depend_table
# select date_sub(current_date,1) as etl_date
# ;

# 寫(xiě)法二:用shell參數(shù)
insert into dm_userimage.Azkaban_depend_table
select ${yesterday}
;  


EOF
#--------------------------------- End ------------------------------------------------------
now=$(date "+%Y-%m-%d %H:%M:%S")           #當(dāng)前時(shí)間
echo "${now} ${yesterday} end!!!"

</pre>

<font color=#FF00FF>一個(gè)完整的Shell 腳本文件參考《finishCheck.sh》</font>

<pre>

!/bin/bash

檢查指定表的etl_date昨天的分區(qū)是否存在且至少有一條記錄释树,檢測(cè)有數(shù)據(jù)成功退出肠槽,沒(méi)有錯(cuò)誤退出

yesterday=$(date -d "-1 days" +%Y-%m-%d)

yesterday='2020-03-31'

tn="1" if [{tn:0-2}=='-m' ]
then
select_names='snapshot_date'
else
select_names='etl_date'
fi
echo $select_names

result=hive -e "select $select_names from $1 where $select_names = '"$yesterday"' limit 1"
echo result if [[ -nresult && result =~yesterday$ ]]
then
echo "今天的數(shù)據(jù)運(yùn)行成功!"
exit 0
else
echo "今天的數(shù)據(jù)運(yùn)行失斏萆丁秸仙!"
exit 1
fi
</pre>

<font color=#FF00FF>shell腳本運(yùn)行python程序</font>

  • 方法一:
    <pre>

    !/bin/bash

    python -c 'print "111";'
    </pre>

  • 方法二:
    <pre>-------------

    !/bin/bash

    python <<EOF #開(kāi)始符合和結(jié)束符合相同
    print '11'
    EOF
    </pre>-----------

加個(gè)"-"最下面的EOF就可以不是行頭但必須是 "tal"

1、考慮下面的需求桩盲,在主shell執(zhí)行命令寂纪,進(jìn)入其他的命令,后面的輸入,想作為命令的輸入捞蛋,而不是主shell的輸入孝冒,怎么辦?

2拟杉、使用<<EOF庄涡,告訴主shell,后續(xù)的輸入捣域,是其他命令或者子shell的輸入啼染,直到遇到EOF為止,再回到主shell焕梅。

3迹鹅、這里的EOF只是分界符,使用其他的字符也可以贞言。


<font color=blue>腳本讀取文件內(nèi)容并輸出</font>

這里主要介紹三種方式:

<font color=#FF00FF> 方式一 </font>

<pre>
#/bin/bash
while read line
do
echo $line
done < a.txt
</pre>

<font color=#FF00FF> 方式二 </font>

<pre>
#/bin/bash
cat a.txt | while read line
do
echo $line
done
</pre>

<font color=#FF00FF> 方式三 </font>

<pre>
for line in (cat a.txt) do echoline
done
</pre>

<font color=blue>常見(jiàn)問(wèn)答</font>

<font color=#FF00FF> 條件判斷[ -n str ] </font>

問(wèn):linux里while [ -n "$1" ]這里的-n是什么意思?
答:-n str斜棚,字符串不為null,長(zhǎng)度大于零

  • 示例
    <pre>
    if [ -n "$1" ]; then
    echo "包含第一個(gè)參數(shù)"
    else
    echo "沒(méi)有包含第一參數(shù)"
    fi
    </pre>

<font color=#FF00FF> exit n </font>

  • exit 0 代表正常運(yùn)行程序并退出程序,
  • exit 1 代表非正常運(yùn)行導(dǎo)致退出程序

<font color=blue>常見(jiàn)錯(cuò)誤</font>

<font color=#FF00FF>解決“/bin/bash^M: bad interpreter: No such file or directory”</font>

在執(zhí)行shell腳本時(shí)提示這樣的錯(cuò)誤主要是由于shell腳本文件是dos格式该窗,即每一行結(jié)尾以\r\n來(lái)標(biāo)識(shí)弟蚀,而unix格式的文件行尾則以\n來(lái)標(biāo)識(shí)。
查看腳本文件是dos格式還是unix格式的幾種辦法酗失。

  1. <mark>cat -A filename</mark> 從顯示結(jié)果可以判斷义钉,dos格式的文件行尾為^M,unix格式的文件行尾為"\"规肴。
  • od -t x1 filename 如果看到輸出內(nèi)容中存在0d 0a的字符捶闸,那么文件是dos格式,如果只有0a拖刃,則是unix格式删壮。
  • <table><td bgcolor=orange> vi filename打開(kāi)文件,執(zhí)行 <mark>: set ff</mark>兑牡,如果文件為dos格式在顯示為fileformat=dos央碟,如果是unxi則顯示為fileformat=unix.</td></table>

解決方法:

  1. 使用linux命令<mark>dos2unix filename</mark>碉碉,直接把文件轉(zhuǎn)換為unix格式
  • 使用sed命令sed -i "s/\r//" filename 或者 sed -i "s/^M//" filename直接替換結(jié)尾符為unix格式
  • <table><td bgcolor=orange> vi filename打開(kāi)文件蒸健,執(zhí)行 <mark>: set ff=unix</mark> 設(shè)置文件為unix,然后執(zhí)行:wq它呀,保存成unix格式边酒。</td></table>

<font color=#FF00FF>swap file "*.swp" already exists!的解決方法</font>

Linux下編程難免要開(kāi)啟多個(gè)vim共同編輯同一個(gè)文件经柴,這時(shí)再次保存就會(huì)出現(xiàn):

swap file "*.swp" already exists!

[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

  • 原因:
    使用vim編輯文件實(shí)際是先copy一份臨時(shí)文件并映射到內(nèi)存給你編輯, 編輯的是臨時(shí)文件墩朦, 當(dāng)執(zhí)行:w后才保存臨時(shí)文件到原文件坯认,執(zhí)行:q后才刪除臨時(shí)文件。
    每次啟動(dòng)檢索式否有臨時(shí)文件, 有則詢(xún)問(wèn)如何處理牛哺,就會(huì)出現(xiàn)如上情景陋气。
  • 解決方法:
    執(zhí)行以下命令:找到臨時(shí)文件,然后刪除

ll -a //顯示隱藏文件

rm .*.swp //刪除隱藏文件

<font color=blue>Sqoop 幾種導(dǎo)入導(dǎo)出模式</font>

<font color=#FFOOFF>全量導(dǎo)入</font>

例如:
<pre>
bin/sqoop import \ (輸入命令)
--connect jdbc:mysql://bigdata.ibeifeng.com:3306/testdb \ (指定連接jdbc端口和數(shù)據(jù)庫(kù)名稱(chēng))
--username root \ (數(shù)據(jù)庫(kù)用戶(hù)名)
--password root123 \ (密碼 若不適用明文指定數(shù)據(jù)庫(kù)密碼 則可以用-P)
--table user \ (指定數(shù)據(jù)庫(kù)中的一張表)
--target-dir /input/import \ (指定數(shù)據(jù)導(dǎo)入到HDFS上的目錄)
--delete-target-dir \ (如果目標(biāo)目錄已存在引润,則先刪除)
--num-mappers 1 \ (指定使用導(dǎo)入數(shù)據(jù)的map個(gè)數(shù),mapreduce(V1)中的方式可以用-m 1 代替(過(guò)時(shí)))
--fields-terminated-by "," (目標(biāo)文件的分隔符, 默認(rèn)情況下,導(dǎo)入HDFS的每行數(shù)據(jù)分隔符是逗號(hào))
</pre>


<font color=blue>Shell 郵件發(fā)送</font>

<font color=#FFOOFF>mailx郵件發(fā)送(比較好用)</font>

假設(shè)郵件內(nèi)容存儲(chǔ)于msg文件中巩趁,那么可以用如下方法:

<pre>mailx -s "test mail" zdd@163.com < msg </pre>

或者

<pre>cat msg | mailx -s "test mail" zdd@163.com </pre>

把打印的內(nèi)容作為標(biāo)準(zhǔn)輸入,送給mail命令

<pre>echo -e $email_contents | mailx -s "test mail" zdd@163.com </pre>

也可以直接從命令行輸入郵件內(nèi)容:

<pre>mailx -s "test mail" zdd@163.com </pre>

上面這條命令會(huì)進(jìn)入命令行輸入狀態(tài)淳附,此時(shí)可以輸入內(nèi)容议慰,按Ctrl+d鍵來(lái)結(jié)束輸入。

其他選項(xiàng)

-r 指定發(fā)件人

-c 指定抄送人

-b 指定密送人

多個(gè)收件人之間用逗號(hào)分隔

<pre>cat msg | mailx -s "test mail" zdd@163.com,zdd2@163.com,zdd2@163.com</pre>

mail和mailx基本是一樣的奴曙,用法差不多

<font color=#FFOOFF>六種使用Linux命令發(fā)送帶附件的郵件</font>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洽糟,一起剝皮案震驚了整個(gè)濱河市炉菲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坤溃,老刑警劉巖拍霜,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薪介,居然都是意外死亡祠饺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)汁政,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吠裆,“玉大人,你說(shuō)我怎么就攤上這事烂完。” “怎么了诵棵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵抠蚣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我履澳,道長(zhǎng)嘶窄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任距贷,我火速辦了婚禮柄冲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忠蝗。我一直安慰自己现横,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著戒祠,像睡著了一般骇两。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姜盈,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天低千,我揣著相機(jī)與錄音,去河邊找鬼馏颂。 笑死示血,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的救拉。 我是一名探鬼主播难审,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼近上!你這毒婦竟也來(lái)了剔宪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壹无,失蹤者是張志新(化名)和其女友劉穎葱绒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斗锭,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡地淀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岖是。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帮毁。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖豺撑,靈堂內(nèi)的尸體忽然破棺而出烈疚,到底是詐尸還是另有隱情,我是刑警寧澤聪轿,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布爷肝,位于F島的核電站,受9級(jí)特大地震影響陆错,放射性物質(zhì)發(fā)生泄漏灯抛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一音瓷、第九天 我趴在偏房一處隱蔽的房頂上張望对嚼。 院中可真熱鬧,春花似錦绳慎、人聲如沸纵竖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)磨确。三九已至沽甥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乏奥,已是汗流浹背摆舟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邓了,地道東北人恨诱。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骗炉,于是被迫代替她去往敵國(guó)和親照宝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容