shell中字符串
- 字符串可以用單引號,也可以用雙引號,也可以不用引號
- 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的
- 單引號字串中不能出現單引號(對單引號使用轉義符后也不行)
- 雙引號里可以有變量
- 雙引號里可以出現轉義字符
建立軟硬鏈接
ln [參數] [源文件] [目標文件]
軟鏈接:
1.軟鏈接,以路徑的形式存在。類似于Windows操作系統中的快捷方式
2.軟鏈接可以 跨文件系統 ,硬鏈接不可以
3.軟鏈接可以對一個不存在的文件名進行鏈接
4.軟鏈接可以對目錄進行鏈接
硬鏈接:
1.硬鏈接,以文件副本的形式存在。但不占用實際空間。
2.不允許給目錄創建硬鏈接
3.硬鏈接只有在同一個文件系統中才能創建
# 給文件創建軟鏈接,為log2013.log文件創建軟鏈接link2013,如果log2013.log丟失,link2013將失效:
ln -s log2013.log link2013
# 文件創建硬鏈接,為log2013.log創建硬鏈接ln2013,log2013.log與ln2013的各項屬性相同
ln log2013.log ln2013
echo
# 用于字符串的輸出
echo string
echo "It is a test" 或者
echo It is a test
# 顯示變量
#!/bin/sh
read name
echo "$name It is a test"
# 顯示換行
echo -e "OK! \n" # -e 開啟轉義
echo "It is a test"
#!/bin/sh
echo -e "OK! \c" # -e 開啟轉義 \c 不換行
echo "It is a test"
# 顯示結果定向至文件,會覆蓋原有文件內容
echo "It is a test" > myfile
# 內容追加到文件末尾 換行追加
echo "It is a test" >> myfile
# 顯示命令執行結果
echo `date`
tail
tail [參數] [文件]
-f 循環讀取
-q 不顯示處理信息
-v 顯示詳細的處理信息
-c<數目> 顯示的字節數
-n<行數> 顯示文件的尾部 n 行內容
--pid=PID 與-f合用,表示在進程ID,PID死掉之后結束
-q, --quiet, --silent 從不輸出給出文件名的首部
-s, --sleep-interval=S 與-f合用,表示在每次反復的間隔休眠S秒
# 默認顯示最后 10 行
tail notes.log
# 跟蹤名為 notes.log 的文件的增長情況
tail -f notes.log
# 顯示文件 notes.log 的內容,從第 20 行至文件末尾:
tail -n +20 notes.log
less
less aa.log
-N 顯示每行的行號 + 回車
# 可以使用ctrl組合,也可以直接使用U D B F
ctrl + U - 向后移動半屏
ctrl + D - 向前移動半屏
ctrl + B - 向后移動一屏
ctrl + F - 向前移動一屏
Z 向下移動一屏
G - 移動到最后一行
g - 移動到第一行
less aa.log后輸入
/xxx:向下搜索“xxx”的功能
?xxx:向上搜索“xxx”的功能
# 搜索多個條件
/xxx|xxx
# 進入less后跳轉到哪行
:行號g
n 向前顯示搜索結果
Shift+n 向后復看搜索結果
# 指定顯示到哪行
less -N +555 aa.log
# 查找aa.log中xxx內容 -n 顯示行號 -i忽略大小寫
grep -in xxx aa.log
less 在屏幕底部顯示一個冒號(:),等待用戶輸入命令
退出less
ctrl+Z
read
腳本執行賦值的時候,等號左右不要有空格
read -t 5 -p "輸入對應的標號:" num
-s:隱藏輸入的內容
-t:給出等待的時間,超時會退出read 秒
-p:給出提示符。默認不支持"\n"換行
num 用于接收輸入的內容
輸出輸入的內容$num ${num}
read -t 5 -p '請輸入:' num
echo $num
echo '\n'
echo ${num}
awk
對數據進行列的提取,是?本處理?具,默認按照空格切分
sort命令?于將?本?件內容加以排序,-n 按照數值排,-
r 按照倒序來排
案例的sort -n 是按照第?列的數值??進?排序,從
?到?,倒序就是 sort -rn
uniq 去除重復出現的?列, -c 在每列旁邊顯示該?重復
出現的次數。
語法: awk '條件1 {執行動作} 條件2 {執行動作} ...' 文件名
# printf輸出內容后不換行,print是換行
# awk 默認按照空格切分 $1輸出第1列
awk '{printf $1}' aa.sh
awk '{print $1}' aa.sh
$1 #代表第一列
$2 #代表第二列
$0 #代表一整行
-F #指定分割符
# df 用于查詢磁盤使用率
df -h | grep /dev/vda1 | awk '{printf "/dev/vda1的使用率是:"} {print $5}'
echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n", $0}'
# BEGIN 在讀取所有行內容前就開始執行,常常被用于修改內置變量的值
# FS 在BEGIN時用于定義分割符
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'
# END 結束的時候執行
# NR 行號
df -h | awk 'NR==2 {print $5}' awk '(NR>=20 && NR<=30) {print $1}' /etc/passwd
grep
grep 對數據進行 行 的提取
語法:grep [選項]...[內容]...[file]
[選項] 可以不寫,默認是查找匹配內容
-v #對內容進行取反提取 除了查找內容的以外內容
# -n 顯示行號 123為要搜索的內容 aa.sh是從文件搜索
grep -n '123' 'aa.sh'
# 也可以 |為管道符 cat出的內容輸送給grep
cat 'aa.sh' | grep -n '123'
cut
cut 對列數據提取
語法:cut [選項]...[file]
-d #指定分割符
-f #指定截取區域
-c #以字符為單位進行分割
# 查找aa.sh文件中有bin字符的行輸出。cut對列提取
# -d對輸出的行以':'分隔,然后取出-f 1 第一列
grep 'bin' 'aa.sh' | cut -d':' -f1
cat
用于連接文件并打印到標準輸出設備上
# cat和echo使用 > 和 >>區別
>: 是覆蓋原有文件內容
>>: 追加到原有文件末尾 會換行追加
# textfile1 的文檔內容--加上行號后--輸入 textfile2 這個文檔里
cat -n textfile1 > textfile2
# textfile1 和 textfile2 的文檔內容--加上行號(空白行不加)之后--將內容附加到 textfile3 文檔里
cat -b textfile1 textfile2 >> textfile3
# 清空 /etc/test.txt 文檔內容
cat /dev/null > /etc/test.txt
sed
sed的應用場景:主要對數據進行處理(選取,新增,替換,刪除,搜索)
-n #把匹配到的行輸出打印到屏幕
p #以行為單位進行查詢,通常與-n一起使用
df -h | sed -n '2p'
d #刪除
sed '2d' df.txt
a #在行的下面插入新的內容
sed '2a 1234567890' df.txt
i #在行的上面插入新的內容
sed '2i 1234567890' df.txt
c #替換
sed '2c 1234567890' df.txt
s/要被取代的內容/ 新的字符串/g #指定內容進行替換 sed 's/0%/100%/g' df.txt
搜索:在文件中搜索內容
cat -n df.txt | sed -n '/100%/p'
-e #表示可以執行多條動作
cat -n df.txt | sed -n -e 's/100%/100%---- -100%/g' -e '/100%-----100%/p'
# -n是顯示行 搜索k的行顯示
sed -n '/k/p' aa.sh
# 打印8到24行
sed -n '8,24p' aa.sh
sed -n '8,24p' aa.sh | grep 'k'
shell語法
-e 目標是否存在(exist)
-d 是否為路徑(directory)
-f 是否為文件(file)
# 判斷當前目錄下是否有foer.sh這個文件,假如沒有就創建出foer.sh 文件
[ -e foer.sh ] || touch foer.sh 文件
-r 是否有讀取權限(read)
-w 是否有寫入權限(write)
-x 是否有執行權限(excute)
[ -x 123.txt ] && echo '有執行權限'
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于或者等于(greater or equal)
-le 小于或者等于(lesser or equal)
# if判斷,[]內部判斷要有空格
if [ $num == 5 ];then
echo 'xx'
elif [ $num == 6 ];then
echo 'xx'
fi
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思
if [ $num == 6 -o $num == 8 ];then
echo 'xx'
fi
while [ 條件判斷式 ]
do
執行動作
done
# for循環
for i in 1 2 3 4 5
do
echo "$i"
sleep 1
done
# `cat xxx` ``這里可以放置其他shell命令
# 默認以空格切分 循環輸出內容
for i in `cat /home/ljw/jb.sh`
do
# 雙引號里可以有變量,單引號不行
echo "$i"
sleep 1
done
# 查找系統/目錄下的文件
find / -ctime +10 -a -type f -name "*.log"
-ctime +10:十天以前的
-type f:是文件類型
-name:指定名字
腳本樣例
# $? 判斷上個命令執行狀態返回0=ok 1=fail
# $aa 或者 ${aa} 都是獲取變量aa的值
例如:{}處理連接符的問題,aa=22 則${aa}book 輸出是22book 如果使用$aabook 則會把aabook當做變量
# cat 用于查看小文件的命令
[root@MiWiFi-R2D-srv ljw]# ./gg.sh 44 66 kkk ss
第0個參數:./gg.sh
第1個參數:44
第2個參數:66
輸入的所有參數是什么:4
總共輸入了多少個參數:44 66 kkk ss
注意:
$0 獲取當前執行文件的文件名
$1 獲取輸入的第一個元素44
$2 獲取輸入的第一個元素66
$# 獲取一共輸入的參數
$* 等到輸入參數的個數
# gg.sh文件
echo "第0個參數:$0"
echo "第1個參數:$1"
echo "第2個參數:$2"
echo "輸入的所有參數是什么:$#"
echo "總共輸入了多少個參數:$*"
常見的幾個符號
# 追加內容echo用于少量輸入,,cat用于多內容輸入
# >會覆蓋原有的內容
cat >gg.txt
回車然后輸入內容 control z可以退出
# >>不會覆蓋原有的內容
例如:echo aa >> bb.txt
把aa追加到bb.txt文件的末尾
# ; 用于執行多條命令
cat bb.txt ; ls
當前目錄下先執行cat命令,然后再執行ls命令
# | 管道符
cat bb.txt | grep bb
符號|就是從cat命令輸出的內容里面,繼續執行grep的結果 grep查詢內容
# && 前面的命令執行成功,后面的才可以執行
cat ssdd.txt && ls
# || 前面的命令執行失敗,后面的才可以執行
num = 6
# 雙引號里面會輸出變量值
"" 會輸出變量值 "$num" = 6
# 單引號會直接字符串輸出
'' 輸出本身 '$num' = $num
# `` 反撇號輸出命令結果
a=`date`
# $a就是日期
echo $a
# 輸入的內容賦給 pass
echo "輸入你的賬號:"
read pass
echo "這是我的輸入;$pass"
# 字符上色
# ``反撇號用于里面內容是命令,需要正常執行
read -p "`echo -e "\033[31m 請輸入賬號: \033[0m"`"
echo -e "\033[31m 紅色字 \033[0m"
查看訪問最頻繁的前100個IP
# 內容都是以空格分隔,'{print $1}' 輸出列的第一列$1
awk '{print $1}' access_temp.log | sort -n | uniq -c | sort -rn | head -n 5
統計訪問最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
統計耗時接?, 列出傳輸時間超過 2 秒的接?,顯示前5條
cat time_temp.log | awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
備注:$NF 表示最后?列, awk '{print $NF}'
腳本執行賦值的時候,等號左右不要有空格
sh文件執行方法:
方法1: ./shell.sh
方法2: sh shell.sh 或者bash shell.sh
方法3: source shell.sh
# 沒有權限時
添加執行權限 chmod +x shell.sh
不同于其它語言需要先聲明變量
shell的變量直接使用,
eg: a=15
調用變量的話 $a 或者 a 或者 ${a}
$? #判斷上一條命令執行的是否成功
$0 #返回腳本的文件名稱
$1-$9 #返回對應的參數值
$* #返回所有的參數值是什么
$# #返回參數的個數和
>會覆蓋原有的內容
>>不會覆蓋原有的內容(追加)
; #執行多條命令
| #管道符
&& #前面的命令執行成功,后面的才可以執行
|| #前面的命令執行失敗,后面的才可以執行
"" #會輸出變量值
'' #輸出本身
`` #輸出命令結果
eg:a=`date`; echo $a
# and
if [ c1 -a c2 ]; then
…
fi
# and
if [ c1 ] && [ c2 ]; then
…
fi
# or
if [ c1 -o c2 ]; then
…
fi
# or
if [ c1 ] || [ c2 ]; then
…
fi
語法:[ 判斷表達式 ]
文件(夾)或者路徑:
-e 目標是否存在(exist)
-d 是否為路徑(directory)
-f 是否為文件(file)
#判斷當前目錄下是否有foer.sh這個文件,假如沒有就創建出foer.sh
[ -e foer.sh ] || touch foer.sh
權限:
-r 是否有讀取權限(read)
-w 是否有寫入權限(write)
-x 是否有執行權限(excute)
[ -x 123.txt ] && echo '有執行權限'
整數值(int型):
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于或者等于(greater or equal) -le 小于或者等于(lesser or equal)
[ 9 -gt 8 ] && echo '大于'
小數(浮點型):
[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo '小于'
字符串:
= 相等
!= 不相等
[ 'kkkkk' != 'kkkk' ] && echo '不等于'
&&: 前面內容ok,后面才會執行
||: 前面內容no ok,后面才會執行
bc計算器
保留多少位小數可以通過scale 但是scale只對除法,取余數,乘冪 有效,對加減沒有效
#計算出0.2+0.3的和并保留倆位小數,此時bc計算器會省略掉個位數的0
echo "scale=2;(0.2+0.3)/1" | bc
#計算出1.2+1.3的和并保留倆位小數
echo "scale=2;(1.2+1.3)/1" | bc
name=kk
echo ${#name}
lsof -i:9900
$?
如果lsof查出來有內容,$?:0 否則是1