linux常見命令以及shell入門編程(筆記總結記錄)
一、linux常見命令
更多命令參考
1.不常用
man
diff
touch
which
ssh
wc
date
exit
kill
id
ps
sleep
uname
passwd
ping
df
telnet
top
sudo
su
reboot
shutdown
free
rpm
useradd
yum
ip
set
export
2.常用
cd
curl
ls/ll
cat
chmod
chown
cp
find
mv
rm
pwd
head
tail
mkdir
scp
tar
zip
unzip
gzip
xargs
let:是 BASH 中用于變數計算的工具,用于執行一個或多個運算式
eg:
[root@localhost learn-shell]# a=1
[root@localhost learn-shell]# b=2
[root@localhost learn-shell]# let c=a+b
[root@localhost learn-shell]# echo $c
3
[root@localhost learn-shell]# let c++
[root@localhost learn-shell]# echo $c
4
[root@localhost learn-shell]# let c--
[root@localhost learn-shell]# echo $c
3
[root@localhost learn-shell]# let c+=10
[root@localhost learn-shell]# echo $c
13
[root@localhost learn-shell]# let c-=10
[root@localhost learn-shell]# echo $c
3
[root@localhost learn-shell]# let c=c+10
[root@localhost learn-shell]# echo $c
13
[root@localhost learn-shell]# let c=c-10
[root@localhost learn-shell]# echo $c
3
[root@localhost learn-shell]#
3.資料查找處理相關
grep cut awk sed
1.grep
1.語法
grep OPTION... [PATTERN] [FILE]...
grep option...[查找的內容]...[file]
grep option...[查找的內容]...[path]
// 注意:使用path,option必須加上-r
// grep -rn zhuyz ./
// grep -r '\w' ./
備注:查找的內容可以是正則運算式
2.作用:對資料進行行提取
3.option
-v #對內容進行取反提取(列印出不符合條件的內容)
-n #對提取的內容顯示行號
-w #精確匹配
-i #忽略大小寫
^ #匹配開頭行首
-E #正則匹配
-r 遞回查找檔案(當前目錄以及子目錄下所有所有的檔案)
4.eg
grep zhuyz abc* // 查找當前路徑下前綴為abc的所有檔案中包含zhuyz字串的檔案,并且列印出該檔案的行
grep zhuyz *.txt // 查找當前路徑下后綴為.txt的所有檔案中包含zhuyz字串的檔案,并且列印出該檔案的行
grep -r zhuyz ./ // 遞回查找當前目錄下以及子目錄下的所有檔案中包含zhuyz字串的檔案,并且列印出該檔案的行
grep -v zhuyz abc.txt // 查找abc.txt中不包含有zhuyz字串的行內容,并且答應出這些行
grep -rn zhuyz * // 遞回查找當前路徑下以及子路徑下所有檔案 && 顯示行號
grep '\W' abc.txt // 正則匹配\W:匹配非字母、數字、下劃線
生產中查看日志:
grep -n '2021-02-28 12:00:00' *.log | grep -n 'ERROR' *.log | grep -n 'Exception' *.log
find ./ -type f -name "*.log" | xargs grep "ERROR|Exception" // 匹配找到當前目錄以及子目錄下以.log后綴的檔案,傳遞給grep命令執行,
2.cut
1.語法
cut OPTION... [FILE]...
2.作用:對資料進行列的提取
3.option
-d #指定分割符
-f #指定截取區域
-c #以字符為單位進行分割
4.eg
-d和-f
以':'為分隔符,截取出/etc/passwd的第一列跟第三列
cut -d ':' -f 1,3 /etc/passwd
以':'為分隔符,截取出/etc/passwd的第一列到第三列
cut -d ':' -f 1-3 /etc/passwd
以':'為分隔符,截取出/etc/passwd的第二列到最后一列
cut -d ':' -f 2- /etc/passwd
-c
截取/etc/passwd檔案從第二個字符到第九個字符
cut -c 2-9 /etc/passwd
3.awk
參考鏈接
1.語法
awk [option] 'script' var=value file(s)
或awk [option] -f scriptfile var=value file(s)
awk '{[pattern] action}' {filenames}
awk -F "分隔符" 'script' {filenames}
awk -v # 設定變數
awk -f {awk腳本} {檔案名}
awk '條件 {執行動作}'檔案名
awk '條件1 {執行動作} 條件2 {執行動作} ...' 檔案名
或awk [選項] '條件1 {執行動作} 條件2 {執行動作} ...' 檔案名
2.作用:對資料進行列的提取
3.eg
printf #格式化輸出,不會自動換行,
(%ns:字串型,n代表有多少個字符; %ni:整型,n代表輸出幾個數字;%.nf:浮點型,n代表的是小數點后有多少個
小數)
print #列印出內容,默認會自動換行
\t #制表符
\n #換行符
eg:printf '%s\t%s\t%s\t%s\t%s\t%s\n' 1 2 3 4 5 6
eg:df -h |grep /dev/vda1 | awk '{printf "/dev/vda1的使用率是:"} {print $5}'
小數:echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n", $0}'
$1 #代表第一列
$2 #代表第二列
$0 #代表一整行
eg: df -h | grep /dev/vda1 | awk '{print $5}'
-F #指定分割符
eg:cat /etc/passwd | awk -F":" '{print $1}'
BEGIN #在讀取所有行內容前就開始執行,常常被用于修改內置變數的值
FS #BEGIN時定義分割符
eg:cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'
END #結束的時候 執行
NR #行號
eg:df -h | awk 'NR==2 {print $5}'
awk '(NR>=20 && NR<=30) {print $1}' /etc/passwd
4.sed
參考
1.語法
sed [選項][動作] 檔案名
2.對資料行進行處理(選取,新增,替換,洗掉,搜索)
3.常見的選項與引數:
-n #把匹配到的行輸出列印到螢屏
p #以行為單位進行查詢,通常與-n一起使用
eg:df -h | sed -n '2p'
d #洗掉
eg: sed '2d' df.txt // 洗掉第二行
eg: sed '2,5d' df.txt // 洗掉第二行到第五行
eg: sed '2,$d' df.txt // 洗掉第二行到最后一行
a #在行的下面插入新的內容
eg: sed '2a 1234567890' df.txt
i #在行的上面插入新的內容
eg: sed '2i 1234567890' df.txt
eg: sed '2,5i 1234567890' df.txt
c #替換
eg: sed '2c 1234567890' df.txt
eg: sed '2,5c 1234567890' df.txt
s/要被取代的內容/新的字串/g #指定內容進行替換
eg: sed 's/0%/100%/g' df.txt
-i #對源檔案進行修改(高危操作,慎用,用之前需要備份源檔案)
搜索:在檔案中搜索內容
eg:cat -n df.txt | sed -n '/100%/p'
-e #表示可以執行多條動作
eg:cat -n df.txt | sed -n -e 's/100%/100%-----100%/g' -e '/100%-----100%/p
備注:如果sed命令想要使用正則匹配,一定要加上/,例如:sed '/[a-z]/' df.txt
4.shell命令相關
1.echo
1.作用:字串的輸出
2.可選引數:
-n 不輸出跟隨在換行符后的內容
-e 啟用反斜杠轉義
-E 不啟用反斜杠轉義(默認)
如果-e有效,則識別字串中出現的以下:
\\ 反斜杠
\n 換行
\r carriage return
\t 水平制表符
\v 垂直制表符
3.輸出:
1.普通字符 echo "Hello zhuyz" // 輸出:Hello zhuyz
2.轉義字符 echo "\"Hello zhuyz\"" // 輸出:"Hello zhuyz"
3.變數 user_name=zhuyz;echo "${user_name}" // 輸出:zhuyz
4.換行 echo -e "Hello \n zhuyz" # -e 開啟轉義 // 換行輸出
5.不換行 echo -e "Hello \c zhuyz"
6.使用單引號 user_name=zhuyz;echo 'Hello ${user_name}' //原樣輸出:Hello ${user_name}
2.read
1.作用:從標準輸入讀取數值
2.可選引數:
-p:后面跟提示資訊,即在輸入前列印提示資訊,默認不支持"\n"換行
-s:隱藏輸入的內容
-t:給出等待的時間,超時會退出read
-n:限制讀取字符的個數,觸發到臨界值會自動執行
3.eg:
echo "請輸入姓名:"
read name
echo "您輸入的姓名是:${name}"
------------------------------------------
read -p "請輸入姓名:" name // -p 輸入前列印提示資訊,和其他命令結合,-p一定要放在最后
echo "您輸入的姓名是:${name}"
------------------------------------------
read -t 5 -p "請輸入姓名:" name // -t 超時等待5s
echo "您輸入的姓名是:${name}"
------------------------------------------
read -n 3 -p "請輸入姓名:" name // -n 限制輸入的字符數
echo "您輸入的姓名是:${name}"
------------------------------------------
##### eg:讀取檔案內容
1.test.txt檔案內容為:
123
abc
zhuyz niupi
2.shell腳本內容:
count=1
cat test.txt | while read line; do // 把cat命令的輸出作為read的輸入,通過while回圈read每一行資料
echo "第${count}行值為:$line"
$count=$[ $count + 1 ]
done
echo "執行完畢"
3.printf
1.作用:格式化輸出字串
2.語法:printf format-string [args...] // args可為多個,以空格隔開
3.格式化通配符
%s 輸出一個字串
%d 輸出一個整型
%c 輸出一個字符
%f 輸出一個浮點數
4.轉義字符
常用:\n \r \v \\
eg3:
[root@localhost learn-shell]# printf "%10s %10s %8s\n" zhuyz is dad // %10s:右對齊占位顯示10個字符
zhuyz is dad
[root@localhost learn-shell]# printf "%-10s %-10s %-8s\n" zhuyz is dad // %-10s:左對齊占位顯示10個字符
zhuyz is dad
[root@localhost learn-shell]#
eg4:
[root@localhost learn-shell]# printf "Hello\nzhuyz\n"
Hello
zhuyz
[root@localhost learn-shell]#
5.常見特殊符號作用
1. > 覆寫原有內容
2. >> 追加內容
3. ; 命令邊界,常用于一次性執行多條命令
4. | 管道符,用于將兩條命令隔開,將前面命令的輸出作為后面的輸入
5. && 前面的命令執行成功,后面的才可以執行
6. || 前面的命令執行失敗,后面的才可以執行
7. "" 會輸出變數值
8. '' 輸出本身內容
9. `` 命令替換,將反引號內的Linux命令先執行,然后將執行結果賦予變數
10. 2>/dev/null 錯誤輸出到無底洞
11. 1>/dev/null 正確輸出到無底洞
1.eg:
cat >abc.txt
2.eg:
cat >>abc.txt
3.eg:
cat -n abc.txt;ll
4.eg:
cat abc.txt | grep 'zhuyz'
5.eg:
[ -f abc.txt ] && echo "abc.txt檔案存在"
6.eg:
[ 1 -gt 2 ] || echo "1不大于2"
7.eg:
user_name=zhuyz
echo "${user_name}" // 輸出:zhuyz
8.eg:
usser_name=zhuyz
echo '${user_name}' // 輸出:${user_name}
9.eg:
a=`date`;echo ${a}
二、shell基礎內容
1.變數
1.1.命名規范
命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭,
中間不能有空格,可以使用下劃線(_),
不能使用標點符號,
不能使用bash里的關鍵字(可用help命令查看保留關鍵字),
eg:
a=zhuyz
user_name=zhuyz
userAge=100
1.2.使用變數
1.變數使用以及使用的規范(${})
eg:
user_name=zhuyz
echo $user_name
echo ${user_name} // {}是用來識別變數邊界,最好加上
echo "${user_name}giao"
2.只讀變數(readonly)
eg:
user_name=zhuyz
readonly user_name // 設定變數為只讀,相當于java中的final關鍵字
3.洗掉變數(unset)
eg:
user_name=zhuyz
unset user_name
4.變數的作用域(區域/全域/環境)
[參考博客](http://c.biancheng.net/view/773.html)
4.1.區域變數(變數前加local修飾符,不加則代表為全域變數)
eg:(該例子在sh腳本檔案中展示)
funciton func() {
local user_name=zhuyz
}
func
echo ${user_name} // 輸出為空
4.2.全域變數(作用域:當前shell行程)
eg:
user_name=zhuyz
echo ${user_name}
4.3.環境變數(作用域:當前shell行程以及子行程)
eg:
[root@localhost ~]# user_name=zhuyz // 定義全域變數user_name
[root@localhost ~]# echo ${user_name} // 輸出user_name成功
zhuyz
[root@localhost ~]# bash // 進入shell子行程
[root@localhost ~]# echo ${user_name} // 輸出user_name失敗
[root@localhost ~]# exit // 退出子行程
exit
[root@localhost ~]# export user_age=25 // 設定環境變數user_age
[root@localhost ~]# bash // 進入shell子行程
[root@localhost ~]# echo ${user_age} // 輸出user_age成功
25
[root@localhost ~]# exit
exit
[root@localhost ~]#
1.3.shell字串
1.單引號和雙引號區別
見 一、5.常見特殊符號作用 中說明
補充:雙引號可以有變數和特殊字符
eg:
user_name=zhuyz
user_age=24
echo "${user_name}\t的年齡是\t${user_age}" // 輸出:zhuyz 的年齡是 24
2.獲取字串長度(${#str})
eg:
user_name="zhuyz"
echo ${#user_name} // 輸出:5
3.截取字串(${str:start:len})
備注:從start索引位開始截取len個字符(字串索引下標從0開始)
eg:
user_name="zhuyz"
echo ${user_name:0:3} // 輸出:zhu
1.4.shell陣列
1.簡要描述:一維陣列,不支持二維
2.定義:
arr=(v1 v2 v3 v4 ...)
或者
arr[0]=v1
arr[1]=v2
arr[n]=vn
eg:
stu_name=(zhuyz1 zhuyz2 zhuyz3)
或者
stu_name[0]=zhuyz1
stu_name[1]=zhuyz2
stu_name[n]=zhuyzn
3.讀取元素
讀取單個元素:${arr[index]}
讀取全部元素:${arr[@]}
4.獲取陣列長度
${#arr[@]} 或者 ${#arr[*]}
2.shell注釋
1.單行注釋:#
eg:
# by zhuyz
2.多行注釋:和xml標簽類似,有標簽頭和標簽尾的感覺
eg1:
:<<EOF
注釋內容...
注釋內容...
...
EOF
eg2:
:<<!
注釋內容...
注釋內容...
...
!
備注:eg1中EOF和eg2中的!可以是任意字符,但是需要在開頭和結尾都存在
3.shell傳遞引數
$? #判斷上一條命令執行的是否成功
$0 #回傳腳本的檔案名稱
$1-$9 #回傳對應的引數值
$* #回傳所有的引數值是什么
$# #回傳引數的個數和
eg:
[root@localhost learn-shell]# vi test.sh
#!/bin/bash
# by zhuyz
echo "Shell 傳遞引數實體!";
echo "執行的檔案名:$0";
echo "第一個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";
echo "傳遞引數有$#個";
-------------------------------------------------------
輸出:
[root@localhost learn-shell]# sh test.sh 1 2 3
Shell 傳遞引數實體!
執行的檔案名:test.sh
第一個引數為:1
第二個引數為:2
第三個引數為:3
傳遞引數有3個
[root@localhost learn-shell]#
4.運算子
1.算數運算子
+ - \* / % = == !=
== 比較數字是否相等
eg:(- \* / %和+類似)
expr $a + $b
echo $[a+b]
echo $((a+b))
eg:
[ $a==$b ]
!= 比較數字是否不等
eg:
[ $a!=$b ]
補充:小數的運算(bc計算器)
scale保留多少位小數,scale只對除法,取余數,乘冪 有效,對加減沒有效,
eg:
echo "scale=2;(0.2+0.3)/1" | bc // 會省略小數點前的0
echo "scale=2;(1.2+1.3)/1" | bc
2.關系運算子(只支持數字)
-eq -ne -gt -lt -ge -le
eg:
[ $a -eq $b ]
3.布爾運算子
! 非
-o 或(有一個運算式為ture,則為true,反之false,前后命令都會執行)
-a 與(兩個運算式都為ture,則為true,反之false,前后命令都會執行)
eg:
[ !false ] // 表示true
eg:
a=10
b=20
[ $a -lt 10 -o $b -gt 20 ]
[ $a -lt 10 -a $b -gt 20 ]
4.邏輯運算子(和java中的&& ||一樣,存在短路)
&& 短路與
|| 短路或
備注:判斷時需要加兩個括號[[ expr ]]
eg:
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "回傳 true"
else
echo "回傳 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "回傳 true"
else
echo "回傳 false"
fi
5.字串運算子
= 檢測兩個字串是否相等,相等回傳 true,
!= 檢測兩個字串是否不相等,不相等回傳 true,
-z 檢測字串長度是否為0,為0回傳 true,
-n 檢測字串長度是否不為 0,不為 0 回傳 true,
$ 檢測字串是否為空,不為慷訓傳 true,
eg:
[ $a=$b ]
[ $a!=$b ]
[ -z $a ]
[ -n $a ]
[ $a ]
6.檔案相關運算子
-d 是否為目錄(檔案夾)
-f 是否為檔案
-e 檔案/目錄 是否存在,存在檔案/目錄,則為true
-s 檔案大小是否為0,大于0,則為true
-r 檔案是否可讀
-w 檔案是否可寫
-x 檔案是否可執行
eg:
[ -d $directory ]
[ -f $file ]
[ -e $file ]
[ -s $file ]
[ -r $file ]
[ -w $file ]
[ -x $file ]
5.流程控制陳述句
if for case while break continue
1.if
單分支判斷:
if [ 條件判斷 ];then
執行動作
fi
單分支判斷:
if [ 條件判斷 ];then
執行動作
else
執行動作
fi
多分支判斷:
if [條件判斷];then
執行動作
elif [條件判斷];then
執行動作
elif [條件判斷];then
執行動作
fi
2.for
template:
for 變數名 in 值1 值2 值3 ; do
執行動作
done
eg:
for i in {1..5} ; do
echo $i
done
-------------------------------------------------
template:
for 變數名 in `命令` ; do
執行動作
done
eg:
for i in `seq 1 10` ; do // seq 1 10 命令是 產生從某個數到另外一個數之間的所有整數的命令(包含起始和結束位置的數字)
echo $i
done
-------------------------------------------------
template:
for (( 條件 )); do
執行動作
done
eg:
for (( i = 0; i < 10; i++ )); do
echo $i
done
3.case
和java中的switch case陳述句類似
template:
case 值 in
值1)
執行動作1
;;
值2)
執行動作1
;;
esac
eg:
read -p "請輸入數字: " x
case $x in
1)
echo "等于1"
;;
2)
echo "等于2"
;;
esac
4.while
template:
while [ 條件 ]; do
執行動作
done
eg:
i=0
len=10
while [ $i -lt $len ]; do
echo $i
i=$[ $i + 1 ]
done
-------------------------------------------------
template:
while(( 條件 )) ; do
執行動作
done
eg:
i=0
while (( $i<=10 )); do
echo "$i"
let i++
done
6.shell函式
shell腳本中也可以定義函式,方法和其他的py、js類似(暫時不記錄)
三、shell練習小案例
(案例百度的,實作代碼有的簡介,有的自己寫的)
1.把一個檔案前五行中包含字母的行刪掉,同時洗掉6到10行包含的所有字母
0.txt檔案內容:
第1行1234567890不包含字母
第2行5678asdBBB
第3行56755AASDDssss
第4行78asdfDDDDDDD
第5行123456EEEEEEEE
第6行1234567ASDF
第7行56789ASDF
第8行67890ASDF
第9行78asdfADSF
第10行123456AAAA
第11行67890ASDF
第12行78asdfADSF
第13行123456AAAA
實作1:
head -n5 0.txt | sed '/[a-zA-Z]/d' && sed -n '6,10p' 0.txt | sed 's/[a-zA-Z]//g' && sed -n '11,$p' 0.txt
實作2:
sed -n '1,5p' 0.txt | sed '/[a-zA-Z]/d' && sed -n '6,10p' 0.txt | sed 's/[a-zA-Z]//g' && sed -n '11,$p' 0.txt
實作3:撰寫一個sh腳本
#!/bin/bash
line_number=0
cat 0.txt | while read line ; do
let line_number++
if [ $line_number -lt 5 ]; then
echo $line | sed '/[a-zA-Z]/d'
elif [ $line_number -gt 6 -a $line_number -lt 10 ]; then
echo $line | sed 's/[a-zA-Z]//g'
else
echo $line
fi
done
---------------------------------------------------------------------
輸出結果都為:
第1行1234567890不包含字母
第6行1234567
第7行56789
第8行67890
第9行78
第10行123456
第11行67890ASDF
第12行78asdfADSF
第13行123456AAAA
2.mysql資料庫查詢
#!/bin/bash
# mysql資料庫查詢
read -p '請輸入您要查詢的學生姓名:' sname
read -p '請輸入資料庫用戶:' user
read -p '請輸入資料庫名:' database
echo -e "\n"
read -p '請輸入資料庫密碼:' password
sql="select * from admin_user.emp where name='$sname';"
host=192.168.0.108
mysql -h $host -u $user --password=$password --database=$database -e "$sql"
exit
3.批量創建linux系統用戶
#!/bin/bash
# 批量創建用戶
read -p '請輸入創建的用戶名稱:' name
read -p '請輸入創建用戶的數量:' number
for (( i = 1; i <= $number; i++ )); do
# 1.查看系統中是否存在用戶
cat /etc/passwd | grep "$name$i" 1>/dev/null
exists=`echo $?`
if [ $exists -eq 1 ]; then
# 2.創建用戶
useradd $name$i 2>/dev/null && echo "創建用戶$name$i成功!"
# 3.給新用戶設定密碼并把用戶名和密碼放在文本中
password=`head -2 /dev/urandom | md5sum | cut -c 1-8`
echo $password
# 需要生成隨機密碼(MD5值),MD5其實是一個演算法,用來加密密碼
echo $password | passwd --stdin $name$i 1>/dev/null && echo -e "$name$i\t$password">>/usr/local/newuser_password.txt
else
echo "$name$i已經存在,無需再次創建!"
fi
done
4.記憶體使用率
#!/bin/bash
# 記憶體使用率
mem_total=`free -m | sed -n '2p' | awk '{print $2}'`
mem_used=`free -m | sed -n '2p' | awk '{print $3}'`
mem_free=`free -m | sed -n '2p' | awk '{print $4}'`
Percent_mem_used=`echo "scale=2; $mem_used / $mem_total * 100" | bc`
Percent_mem_free=`echo "scale=2; $mem_free / $mem_total * 100" | bc`
now_time=`date +"%Y-%m-%d %H:%M:%S 星期%w"`
echo -e "\n"
echo -e "$now_time\n記憶體的使用率是:$Percent_mem_used%"
echo -e "記憶體還剩:$Percent_mem_free%未使用"
# 檢查負載是否有壓力
# 當已經使用的內容超過1024m
if [ $mem_used -gt 1024 ]; then
echo -e "\033[31;5m告警:\033[0m"
echo -e "\033[31;5m記憶體使用率已超過負載能力,目前使用率達到$Percent_mem_used% \033[0m"
else
echo "目前記憶體負載正常"
fi
echo -e "\n"
5.如何獲取文本檔案的第 10 行
實作1:
head -10 abc.txt | tail -1
實作2:
sed -n '10p' abc.txt
6.如何計算本地用戶數目
實作1:
wc -l /etc/passwd | cut -d " " -f 1
實作解釋:
wc -l // 統計行數 && 顯示檔案名稱
cut -d // 以指定內容為列分隔符
cut -f // 截取哪一列
實作2:
wc -l /etc/passwd | awk -F " " '{print $1}'
7.寫出輸出數字 0 到 100 中 3 的倍數(0 3 6 9 …)的命令
實作1:
for i in {0..100..3}; do echo $i; done
實作2:
for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done
未待完結
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264775.html
標籤:其他
