【 awk、賦值變量、if】
awk 常用於處理格式非常明顯的文件 awk -F: '{print $1}' /etc/passwd 含義:取冒號分隔符的第一段內容 $0 指取所有! NF 指有幾段內容 $NF 取最后一段內容 NR 指代行號 用 NR做 行定位 awk -F: 'NR==1{print $1,NR}' test 小於等於3行的內容 awk -F: 'NR<=3{print $1,NR}' test 3-5行的內容awk -F: 'NR>=3 && NR<=5{print $1,"---------",NR}' test 小於等於2行,大於等於7行的內容: awk -F: 'NR>=7 || NR<=2{print $1,"---------",NR}' test nologin結尾的用戶名打印出來:awk -F: '/nologin$/{print $1}' test(正則定指,指定文件和打印指定位置) 用戶名r開頭t結尾,中間任意字符,打印UID,awk -F: '$1~/^r.*t/{print NR ,$3}' test ('$1~/^r.*t/用戶名來匹配正則表達式) 只打印指定文件的內容 awk -F: '$1==“root”{print NR ,$1,$3}' test 打印UID大於等於7的用戶名 awk -F: '$3>=7{print NR ,$1}' test 自定義一個變量,然后用awk去打印 用到 -v count =7 awk -v x=$count -F: '$3>=x{print NR,$1,$3}' test 其他變量補充 1、 awk 不指定內容,以空格或是多個空格作為分隔符 查看IP地址! ifconfig |awk 'NR==2{print $2}' 取IP地址 可以定義 ip_addr= 'ifconfig |awk 'NR==2{print $2}' echo $ip_addr 打印結果 2、打印處理重復內容 先把重復的行放在一起,然后去重即可。 sort 排序 uniq 去重 -c 查看去了多少行 cat a.txt | sort |uniq -c 3、輕量級的操作 cut cat test |cut -d: -f1,3簡單的處理文件 4、du -sh /boot/ 查看文件大小 5、find 命令 (找文件) find / -type f 查找根下的普通文件 find / -name “*.txt”查找文件名為什么的文件 find / -size +30M 大於30M的文件 find / -size +10M size -30M 找出大於10M小於30M的文件 find / -size +2M -type f -name \*.txt 找出根下大於2M的名字中后綴為txt的普通文件。 6、查找某個目錄下,包含某個內容文件的文件名全部找出,並打印出來 grep -rl 'root' /test (grep -r 過濾的是目錄) 改主機名腳本 vim a.sh read -p 'please input your hostname:' name hostnamectl set-hostname $name 保存退出 給執行權限,chmod -R +x a.sh 執行:./a.sh shell 變量 1、命名規則:以字母開頭,剩下的部分可以是:字母,數字,下划線。 規范1.以字母開頭 2.使用中划線或者下划線做單詞的連接 3.同類型的用數字區分 4.對於文件最好加上拓展名 5.用戶能一眼看出要做什么 2、系統變量 set:查看所有變量 env:查看系統變量 3、變量賦值 x=1; 變量賦值 echo $1輸出 unset x 刪除變量 4、常用系統變量 PATH 環境變量 PWD 當前路徑 LANG HOME HISTSIZE 歷史命令,最多1000行 PS1 存放當前用戶,用於改用戶名 PS1=**** IFS 5、全局變量和局部變量 全局變量指所有的用戶都通用。 局部變量指僅僅當前用戶可用。 export 用於linux中定義全局變量,任何位置都有效 鏈接: 變量邊界問題:用{}來定義變量的邊界,括號內是一個整體。 例子:money =10 echo $money ----->10 echo $money0000 沒法輸出,加上{}即可。 echo ${money}0000 ----->100000 計算內存使用率 free 查看內存 mem_total='free | awk 'NR==2{print $2}'' 總內存 mem_use= 'free | awk 'NR==3{print $3}'' 使用內存 echo $mem_use 查看結果 浮點運算 echo 'scale=2; $mem_use/$mem_total' | bc -l |cut -d. -f2 mem_per=' echo "scale=2; $mem_use/$mem_total" | bc -l |cut -d. -f2' echo ${mem_per}% 百分號的使用率 運算符 注意:用$取值!!! 1、算術運算符 + - * / % 2、關系操作 < > <= >= == !=(不等於) &&(與) ||(或) 用兩個小括號,做關系運算(())。 test命令,也可以做關系運算! 中括號[]的語法結構和test一樣,用中括號的話,與test連用。整型! 命令下: -gt 大於 -lt 小於 -ge大於等於 -le小於等於 -eq 等於 -ne 不等於 -a 同時成功 -o 僅有一個成功 賦值運算符 = += *= /=(除等於) %=(取余等於) x=1 x=$[$x+1] echo $x=2 ---------> x=1 ((x+=1)) echo $x 2 自增1或是自減1 ((i++)) ((i--)) shell中的所有計算器 $[] (()) $(()) $$ 進程PID $# 總共有多少參數 $? 上一個命令是否正確運行 測試命令:test[] [[]] (()) 1、測試文件狀態 -d 目錄 -s 文件長度 > 0、非空 -f 正規文件 -w 可寫 -r 可讀 -x 可執行 -L 符號連接 -u 文件有 suid 位設置 2、字符串測試 = 兩個字符串相等 != 兩個字符串不相等 -z 空串 -n 非空串 3、測試數值 -eq 等於 -ne 不等於 -gt 大於 -lt 小於 -ge 大於等於 -le 小於等於 4、擴展測試符號 比較數字,使用(( )) 其他測試使用 [[ ]] 包含數字比較的混合測試,使用[[ expr1 && expr2 ]] (( expr1 || expr2 )) 兩個文件的比較 FILE1 -ef FILE2 測試兩個文件是否是相同的inode 有時為了找到同一個INODE號的文件 更傾向於使用 find 命令的 -inum 或 --samefile FILE1 -nt FILE2 FILE1 is newer (modification date) than FILE2 FILE1 -ot FILE2 FILE1 is older than FILE2 shell 流程控制 創建文件.sh結尾。vim *.sh 編寫shell 以什么開始,以什么反着寫結束。 給文件執行權限 chmod +x *.sh ./*.sh 執行。驗證結果 用戶輸入 :read -p "please input:" var 睡多少秒(延遲)sleep 0.5 延遲0.5秒 輸出用$var var='/etc/passwd' if [ -f $var ] then echo "$" 命名上不要帶系統進程名!容易產生新的進程,倒是執行錯誤。 $1 空格分離的第一個參數 $2空格分離的第二個參數 $3空格分離的第三個參數 $4空格分離的第四個參數 $$ 進程的PID $* 腳本文件后所有參數 $@ 腳本文件后所有參數 $# 總共有多少個參數 $? 上一條命令是否執行成功 應用舉例 重啟nginx 服務 #!/bin/bash ps aux | grep nginx |grep -v 'grep' #查看進程 if [ $? -ne 0 ] #判斷 是否開啟 then systemctl start nginx fi