<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ò)多的小文件
- Linux中查看各文件夾大小命令:https://www.cnblogs.com/iconfig/p/4863063.html
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>
- 菜鳥(niǎo)教程: https://www.runoob.com/linux/linux-tutorial.html
<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
- 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} !"
echo greeting_1
使用單引號(hào)拼接
greeting_2='hello, '{your_name} !'
echo greeting_3
</pre>
<font color=Maroon> 截取字符串</font>
測(cè)試字符串
etl_date="2019-03-01-00-00"
使用#截取"-"之后的內(nèi)容
使用%截取"-"之前的內(nèi)容
符號(hào) | 方向 | 前后字符串 |
---|---|---|
#*- | 從左往右 找第一個(gè)字符‘-’ | 截取字符‘-’之后的字符串 |
%%*- | 從左往右 找第一個(gè)字符‘-’ | 之前 |
##*- | 從右往左 找第一個(gè)字符‘- | 之后的字符串 |
%*- | 從右往左 找第一個(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:0-10:7} #從右邊第10個(gè)字符開(kāi)始埋市,截取7個(gè)字符
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 firstday 1 day" +%Y-%m-%d)
echodate -d "$firstday -1 day" +%Y-%m-%d
#加減一周
echodate -d "$firstday-1 week " +%Y-%m-%d
echodate -d "$firstday+1 week " +%Y-%m-%d
#加減一月
echodate -d "$firstday-1 month " +%Y-%m-%d
echodate -d "$firstday+1 month " +%Y-%m-%d
#加減一年
echodate -d "$firstday-1 year " +%Y-%m-%d
echodate -d "$firstday+1 year " +%Y-%m-%d
<font color=Maroon> 字符串替換的實(shí)現(xiàn)</font>
- 方法一:推薦使用胸蛛,方便
<pre>
maxTime="2020-04-28"
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
https://blog.csdn.net/u010003835/article/details/80750003
<pre>
string="hello,shell,split,test"
array=({array[@]}
do
echo $var
done
</pre>示例
<pre>
date_flag="2020-03-22"
my_array=({my_array[1]}""{my_array[0]}"_"{my_array[2]}"
echo sample_p
</pre>
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 " -(date +%Y-%m)+'-01'
etl_day=first_day -1 day" +%Y-%m-%d) #上月最后一天
last_month=etl_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 #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 #清空文件內(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 file)
do
if [ month_max ] #當(dāng)文件名中的(倒數(shù)8-2數(shù)字表示文件的月份)小于等于當(dāng)前月table_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個(gè)epoch"
cnt=cnt+1 ]
done
</pre>測(cè)試過(guò)的示例
<pre>
nowTime='2019-01-01'
endTime='2019-01-05'
while [[ endTime ]] # 雙方括號(hào)允許高級(jí)字符串模式匹配運(yùn)算抹腿,但是并不是所有的shell都支持雙方括號(hào)
do
echo 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個(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>
- 菜鳥(niǎo):https://www.runoob.com/linux/linux-comm-crontab.html
- https://www.cnblogs.com/sharesdk/p/7852903.html
??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ù)可用兩種方法:
- 在命令行輸入: crontab -e 然后添加相應(yīng)的任務(wù)旗笔,wq存盤(pán)退出。
- 直接編輯/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í)行不成功, 可以查看:
- 文本權(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 -d "-1 days" +%Y-%m-%d) #昨天
</pre>
<font color=#FF00FF>Shell 腳本文件中常用語(yǔ)句</font>
<pre>
0授舟,獲取當(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 (hive -e "select etl_date from 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="{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 && 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 line
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格式的幾種辦法酗失。
- <mark>cat -A filename</mark> 從顯示結(jié)果可以判斷义钉,dos格式的文件行尾為^M"规肴。
- 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>
解決方法:
- 使用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>
- linux 發(fā)送郵件(含附件) https://www.iteblog.com/archives/2027.html?from=like#mailx
<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>
- 示例:
<pre>
email_contents="hi 董曉琳,\n
附件是本月提取的數(shù)據(jù)别凹,煩請(qǐng)查收。" #郵件內(nèi)容
echo -e $email_contents | mailx -s "車(chē)貸數(shù)據(jù)" \ #郵件標(biāo)題
-a /home/edw/log/car_data_monthly.txt \ # 附件
-r cuiyahong180629@credithc.com \ # from somebody
-c mazhongwei180808@credithc.com,xiaoshan161031@credithc.com \ # cc somebody
dongxiaolin180725@credithc.com # to somebody
</pre>