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"
功能
# 共有幾個引數
若引數的個數小於(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檔案時給確認提示。