Linux基礎知識:SHELL腳本;find查找、tar壓縮;sed文件處理工具

Shell腳本編程基礎
程序
程序:算法+數據結構
數據:是程序的核心
數據結構:數據在計算機中的類型和組織方式
算法:處理數據的方式
程序編程風格:
過程式:以指令爲中心,數據服務於指令
對象式:以數據爲中心,指令服務於數據
shell程序:提供了編程能力,解釋執行
高級編程語言:
編譯:高級語言-->編譯器-->機器代碼-->執行
C,C++
解釋:高級語言-->執行-->解釋器-->機器代碼
shell,python,php,JavaScript,perl
編譯語言:像吃大餐,作好再吃,從執行角度看,效率高。
解釋語言:像吃火鍋,邊吃邊作,從開發角度看,效率高。
shell腳本基礎
shell腳本:
包含一些命令或聲明,並符合必定格式的文本文件
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell腳本的用途有:
自動化經常使用命令
執行系統管理和故障排除
建立簡單的應用程序
shell腳本示例
#!/bin/bashphp

------------------------------------------

Filename: hello.sh

Revision: 1.1

Date: 2017/06/01

Author: wang

Email: wang@gmail.com

Website: www.magedu.com

Des處理文本或文件

腳本調試檢測腳本中的語法錯誤
bash -n /path/to/some_script
調試執行bash -x /path/to/somescri
變量
Shell中變量命名法則:
一、不能使程序中的保留字:例如if, for
二、只能使用數字、字母及下劃線,且不能以數字開頭
三、見名知義
四、統一命名規則:駝峯命名法
Shell中命名建議規則:
一、變量名大寫
二、局部變量小寫
三、函數名小寫
四、用英文名字,並體現出實際做用
bash中變量的種類
根據變量的生效範圍等標準劃分下面變量類型
局部變量:生效範圍爲當前shell進程;對當前shell以外的其它shell進程,
包括當前shell的子shell進程均無效
環境變量:生效範圍爲當前shell進程及其子進程
本地變量:生效範圍爲當前shell進程中某代碼片段,一般指函數
位置變量:$1, $2, ...來表示,用於讓腳本在腳本在腳本代碼中調用經過命令行傳遞給它的參數
特殊變量:$?, $0, $*, $@, $#,$$
練習
一、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操做系統版本,內核版本,CPU型號,內存大小,硬盤大小
二、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到
/root/etcYYYY-mm-dd中
三、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
四、編寫腳本/root/bin/links.sh,顯示正鏈接本主機的每一個遠程主機的IPv4地址和鏈接數,並按鏈接數從大到小排序
環境變量
bash內建的環境變量:PATH SHELL USER UID HOME PWD SHLVL LANG MAIL HOSTNAME HISTSIZE
下劃線
只讀和位置變量
 只讀變量:只能聲明,但不能修改和刪除
 聲明只讀變量:
readonly name
declare -r name
 查看只讀變量:
readonly -p
位置變量:在腳本代碼中調用經過命令行傳遞給腳本的參數
$1, $2, ... 對應第一、第2等參數,shift [n]換位置
$0 命令自己
$ 傳遞給腳本的全部參數,所有參數合爲一個字符串
$@ 傳遞給腳本的全部參數,每一個參數爲獨立字符串
$# 傳遞給腳本的參數的個數
注意:$@ $
只在被雙引號包起來的時候纔會有差別
set -- 清空全部位置變量
退出狀態
進程使用退出狀態來報告成功或失敗
0 表明成功,1-255表明失敗
$? 變量保存最近的命令退出狀態
例如:
ping -c1 -W1 hostdown &> /dev/null
echo $?
算術運算
bash中的算術運算:help let
+, -, *, /, %取模(取餘), **(乘方),乘法符號有些場景中須要轉義
實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 數值
(6) echo ‘算術表達式’ | bc
bash有內建的隨機數生成器變量:$RANDOM(0-32767)
示例:生成 0 - 49 之間隨機數
echo $[$RANDOM%50]
短路運算
短路與
第一個爲0,結果一定爲0
第一個爲1,第二個必需要參與運算
短路或
第一個爲1,結果一定爲1
第一個爲0,第二個必需要參與運算
異或:^
異或的兩個值,相同爲假,不一樣爲真
條件性的執行操做符根據退出狀態而定,命令能夠有條件地運行• && 表明條件性的AND THEN• || 表明條件性的OR ELSE例如:grep -q no_such_user /etc/passwd \
|| echo 'No such user' No such userping -c1 -W2 station1 &> /dev/null \python

&& echo "station1 is up" \
|| (echo 'station1 is unreachable'; exit 1)
station1 is up
test命令
長格式的例子:
test "$A" = "$B" && echo "Strings are equal"
test 「$A」-eq 「$B」 && echo "Integers are equal"
簡寫格式的例子:
[ "$A" = "$B" ] && echo "Strings are equal"
[ "$A" -eq "$B" ] && echo "Integers are equal"
bash的數值測試
-v VAR
變量VAR是否設置
數值測試:
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
bash的字符串測試
字符串測試:
= 是否等於
ascii碼是否大於ascii碼
< 是否小於
!= 是否不等於
=~ 左側字符串是否可以被右側的PATTERN所匹配
注意: 此表達式通常用於[[ ]]中;擴展的正則表達式
-z "STRING「 字符串是否爲空,空爲真,不空爲假
-n "STRING「 字符串是否不空,不空爲真,空爲假
注意:用於字符串比較時的用到的操做數都應該使用引號
read -p 「Enter a filename: 「 FILE
條件選擇if語句
選擇執行:
注意:if語句可嵌套
單分支
if 判斷條件;then
條件爲真的分支代碼
fi
雙分支
if 判斷條件; then
條件爲真的分支代碼
else
條件爲假的分支代碼
Fi
If示例
根據命令的退出狀態來執行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null; then
echo 'Station1 is undergoing maintenance‘
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
Fi
條件判斷:case語句
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
)
默認分支
;;
esac
find查找 tar壓縮 部分
查找條件
根據屬主、屬組查找:
-user USERNAME:查找屬主爲指定用戶(UID)的文件
-group GRPNAME: 查找屬組爲指定組(GID)的文件
-uid UserID:查找屬主爲指定的UID號的文件
-gid GroupID:查找屬組爲指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
查找空文件或目錄:find /app -type d -emp
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
示例:找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp ( -not -user root -a -not -name 'f
' ) -ls
find /tmp -not ( -user root -o -name 'f' ) –ls
排除目錄
示例:
查找/etc/下,除/etc/sane.d目錄的其它全部.conf後綴的文件
find /etc -path ‘/etc/sane.d’ -a –prune -o -name 「
.conf」
查找/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的全部.conf後綴的文件
find /etc ( -path "/etc/sane.d" -o -path "/etc/fonts" ) -a -prune -o -
name ".conf"
根據權限查找:根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配便可,或關係,+ 從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關係
0 表示不關注
• find -perm 755 會匹配權限模式剛好是755的文件
• 只要當任意人有寫權限時,find -perm +222就會匹配
• 只有當每一個人都有寫權限時,find -perm -222纔會匹配
• 只有當其它人(other)有寫權限時,find -perm -002纔會匹配
有些命令不能接受過多參數,命令執行可能會失敗,xargs能夠解決
替換參數xargs示例:
ls f
|xargs rm
find /sbin/ -perm +700 |ls -l 這個命令是錯誤的
find /bin/ -perm /7000 | xargs ls -l 查找有特殊權限的文件
find /bin/ -perm -7000 | xargs ls -l 此命令和上面有何區別?
find和xargs格式:find | xargs COMMAND
備份配置文件,添加.orig這個擴展名
find -name 「.conf」 -exec cp {} {}.orig \;
提示刪除存在時間超過3天以上的joe的臨時文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在主目錄中尋找可被其它用戶寫入的文件
find ~ -perm -002 -exec chmod o-w {} \;
查找/data下權限爲644,後綴爲sh的普通文件,增長執行權限
find /data –type f -perm 644 -name 「
.sh」 –exec chmod 755 {} \;
查看/home的目錄
find /home –type d -ls
壓縮:gunzip file.gz 解壓縮
zcat file.gz 不顯式解壓縮的前提下查看文本文件內容
bunzip2 file.bz2 解壓縮
bzcat file.bz2 不顯式解壓縮的前提下查看文本文件內容
unxz file.xz 解壓縮
xzcat file.xz 不顯式解壓縮的前提下查看文本文件內容
打包壓縮
zip –r /backup/sysconfig /etc/sysconfig/
解包解壓縮
unzip sysconfig.zip
cat /var/log/messages | zip messages -
unzip -p message > message
Tar:tar -cpvf /PATH/FILE.tar FILE... 建立歸檔
tar -r -f /PATH/FILE.tar FI 追加文件至文檔
查看歸檔文件中的文件列表
tar -t -f /PATH/FILE.tar
(4) 展開歸檔
tar -x -f /PATH/FILE.tar
tar -x -f /PATH/FILE.tar -C /PATH/
(5) 結合壓縮工具實現:歸檔並壓縮
-j: bzip2, -z: gzip, -J: xz
文件查找工具sed
|sed -r 's@(./)([^/]+)/?@\2@' 取基名
|sed -r 's@(./)([^/]+)/?@\1@' 取目錄名
使用sed命令取IPV4地址:
一、|sed -n '2p' |sed -r 's/inet//' |sed -r 's/netmask.
//' |tr -d " "
二、|sed -n '2p' sed -e 's/^.inet//' -e 's/.//'
三、|sed -n -e '2s/^.inet//' -e '2s/ .//p'
四、|sed -nr '2s@.inet (.) .n.@\1@p'
五、|sed -nr '2s/[^0-9]+([0-9.]+).*/\1/p'正則表達式

相關文章
相關標籤/搜索