1. 程式人生 > >續寫vim,shell腳本基礎編輯,read命令,if與case判斷語句,文件查找方式,壓縮與解壓,

續寫vim,shell腳本基礎編輯,read命令,if與case判斷語句,文件查找方式,壓縮與解壓,

退出 hist match 時間戳 語法錯誤 margin 基本概念 相同 reg

一、 Vim續寫

?1、命令擴展模式的位置定界

??起始位置 cmd 終止位置
???Cmd:
????y復制
????d刪除
????Gu變大寫
????gu變小寫
??例如:0y$命令意味著:
????0 先到行頭
????Y 從這裏開始拷貝
????$ 拷貝到本行行尾最後一個字符
????Ye 從當前位置拷貝到本單詞的最後一個字符

?2、擴展命令模式:地址定界

? ?# 具體第#行,
? ?#1,#2 從開頭數第#1行到第#2行
? ?#1,+#2 從開頭數的第#1行到從第#1行開始數的第#2行
? ? ?例:2,+3 表示第2行到第五行
? ?. 當前行
? ?$ 最後一行
? ?. ,$-1 當前行到倒數第二行

? ?% 全文,相當於1,$
? ?/pat1/,/pat2/ 從第一次被pat1 模式匹配的行開始,一直到第一次被pat2匹配的行結束
? ? #,/pat/ 從第#行到第一次匹配到pat結束
? ? /pat/,$ 從第一次匹配到pat到最後一行
? ?使 用方式:後跟一個編輯命令
? ? ?d 剪切
? ? ?y 復制
? ? ?w file 將範圍內的行另存至指定文件中
? ? ?r file 在指定位置插入指定文件中的所有內容

?3、查找並替換

? ?s: 在擴展模式下完成替換操作
? ?? 地址定界s/要查找的內容/替換為的內容/修飾符
? ? ? ?要查找的內容:可以使用正則表達式
? ? ? ?替換為的內容:不可以使用正則,但可以使用\1,\2調用前面表達式裏的分組,還可以使用&引用前面查找時查找到的整個內容

? ? ? ?修飾符:
? ? ? ? ? i:忽略大小寫
? ? ? ? ?g:全局替換,(默認情況下,每一行只替換第一次出現)
? ? ? ? ?gc :全局替換,每次替換前詢問
? ? ? ? 查找替換中的分隔符/可替換為其它字符,例如:
? ? ? ? ?%s@dog@cat@g 把全文中的dog都替換成cat
? ? ? ? ?%s#dog#cat#i 把每行第一次出現的dog替換成cat,忽略大小寫

?4、Vim的寄存器

? ? ? ?有26個命名寄存器和1個無命名寄存器,常存放不同的剪貼版 內容,可以不同會話間共享
? ? ? ?寄存器名稱a,b,…,z,格式:“寄存器 放在數字和命令之間

? ? ? ? ?如:3"tyy 表示復制3行到t寄存器中
? ? ? ?"tp 表示將t寄存器內容粘貼
? ? ? ?未指定,將使用無命名寄存器
? ? ? ?有10個數字寄存器,用0,1,…,9表示,0存放最近復制內容
? ? ? ?,1存放最近刪除內容。當新的文本變更和刪除時,1轉存到2
? ? ? ?,2轉存到3,以此類推。數字寄存器不能在不同會話間共享

?5、編輯二進制文件

? ?1.以二進制方式打開文件
? ? ? Vim -b 文件路徑
? ?2.擴展命令模式下,利用xxd命令轉換為可讀的十六進制
? ? ?:%!xxd
? ? ?編輯二進制文件
? ?3.擴展命令模式下,利用xxd命令轉換回二進制
? ? ? ? :%!xxd -r
? ? ?保存退出

?6、可視化模式

? ?允許選擇的文本塊
? ? ?v :面向字符
? ? ?V :面向行
? ? ?Ctrl-v 面向塊
? ?可視化鍵可用於與移動鍵結合使用:
? ? ?w 選中一個單詞
? ? ?) } 選中從當前到文本尾部
? ? ?箭頭鍵
? ?突出顯示的文字可被刪除,復制,變更,過濾,搜索,替換等

?7、多文件模式

? ?Vim file1 file2 file3
? ? ?:next 下一個
? ? ?:prev 前一個
? ? ?:first 第一個
? ? ?:last 最後一個
? ? ?:wall 保存所有
? ? ?:qall 退出所有
? ? ?:wqall 保存所有並退出

?8、使用多個“窗口”

? ?1.多文件分隔
? ? ?Vim -o|-O file1 file2
? ? ? ? -o:水平分割
? ? ? ? -O:垂直分割
在窗口間切換:Ctrl+w
技術分享圖片
? ?2.單文件窗口分割
? ? ?Ctrl+w,s:水平分割
? ? ?Ctrl+w,v:垂直分割
? ? ?Ctrl+w,q:取消相鄰窗口
? ? ?Ctrl+w,o:取消全部窗口
? ? ?:wqall 保存退出
技術分享圖片

?9、定制vim的工作特性

???配置文件:永久有效
????全局:/etc/vimrc
????個人: ~/.vimrc
????擴展模式:當前你vim進程有效

??1. 行號

???Set number 顯示行號,簡寫 set nu
???Set nonumber 取消顯示行號 簡寫 set nonu

??2. 括號成對匹配

???Set showmatch 匹配 簡寫 set sm
???Set nosm 取消

??3. 自動縮進

???啟用:set ai
???禁用:set noai

??4. 高亮搜索

???啟用:set hlsearch
???禁用:set nohlsearch

??5. 語法高亮

???啟用:syntax on
???禁用:syntax off

??6. 忽略字符的大小寫

???啟用:set ic
???不忽略:set noic

??7. 文件格式

???啟用windows格式:set fileformat=dos
???啟用unix格式:set fileformat=unix

??8. 設置文本寬度

???:set textwidth=65 (vim only)
???:set wrapmargin=15

??9.Vim內置幫助

???:help

二、 Shell腳本編程基礎

?1、 編程基礎

??程序:指令+數據
??程序編程風格:
??過程式:以指令為中心,數據服務於指令
??對象式:以數據為中心,指令服務於數據
??shell程序:提供了編程能力,解釋執行

?2、 程序的執行方式

??計算機:運行二進制指令
??編程語言:
???低級:匯編
??? 高級:
??????編譯:高級語言-->編譯器-->目標代碼
?????????Java,c#
??????解釋:高級語言-->解釋器-->機器代碼
????????? Shell,perl,python

?3、 編程基本概念

??1.編程邏輯處理方式:

????順序執行
????循環執行
????選擇執行

??2.shell編程:過程式、解釋執行

??3.編程語言的基本結構:

          各種系統命令的組合
          數據存儲:變量、數組
          表達式: a + b
          語句:if

?4、 Shell腳本基礎

??shell腳本:
???包含一些命令或聲明,並符合一定格式的文本文件
??格式要求:
???首行shebang機制(就是首行要寫執行的shell,否則就會使用默認shell來運行該腳本,容易出錯,導致腳本執行錯誤執行)
????#!/bin/bash
????#!/usr/bin/python
????#!/usr/bin/perl
??shell腳本的用途有:
???自動化常用命令
???執行系統管理和故障排除
???創建簡單的應用程序
???處理文本或文件

?5、 創建shell腳本

??第一步:使用文本編輯器來創建文本文件
???第一行必須包括shell聲明序列:#! #!/bin/bash
???添加註釋 註釋以#開頭
??第二步:運行腳本
???給予執行權限,在命令行上指定腳本的絕對或相對路徑
???直接運行解釋器,將腳本作為解釋器程序的參數運行

?6、 腳本規範

??腳本代碼開頭約定
???1.第一行一般為調用使用的語言
???2.程序名,避免更改文件名為無法找到正確的文件
???3.版本號
???4.更改後的時間
???5.作者相關信息
???6.該程序的作用,及註意事項
???7.最後是各版本的更新簡要說明

?7、 腳本的基本結構

??#!SHEBANG
??CONFIGURATION_VARIABLES
??FUNCTION_DEFINITIONS
??MAIN_CODE

?8、 腳本調試

??檢測腳本中的語法錯誤
???bash -n /path/to/some_script
?? 調試執行
??? bash -x /path/to/some_script

?9、 變量

??1.變量:命名的內存空間

???數據存儲方式:
????字符:
????數值:整型,浮點型

??2.變量:變量類型

???作用:
????1、 數據存儲格式
????2、 參與的運算
????3、 表示的數據範圍
???類型:
????字符
????數值:整數、浮點型

??3. 強類型:變量不經過強制轉換,它永遠是這個數據類型,不

???允許隱式的類型轉換。一般定義變量時必須指定類型、參與
???運算必須符合類型要求;調用未聲明變量會產生錯誤
???如Java,c# 弱類型:語言的運行時會隱式做數據類型轉換。無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;
???變量無須事先定義可直接調用
???如bash 不支持浮點數,php

??4. 變量命名法則

???1、不能使程序中的保留字:例如if, for
???2、只能使用數字、字母及下劃線,且不能以數字開頭
???3、見名知義
???4、統一命名規則:駝峰命名法

??5.bash中變量的種類

???本地變量:生效範圍為當前shell進程;對當前shell之外 的其它shell進程,包括當前shell的子shell進程均無效
???環境變量:生效範圍為當前shell進程及其子進程
???局部變量:生效範圍為當前shell進程中某代碼片斷(通常 指函數)
???位置變量:$1, $2, ...來表示,用於讓腳本在腳本代碼 中調用通過命令行傳遞給它的參數
???特殊變量:$?, $0, $*, $@, $#,$$

??6.本地變量

???變量賦值:name=‘value‘
???可以直接引用value:
????1、 可以是直接字符串。Name=“root”
????2、 變量引用:name=“$user”
????3、 命令引用:name=·cmd· 或name=$(cmd)
???變量引用:${name} $name
???“”:弱引用,其中的變量引用會被替換為變量值
???‘’:強引用其中的變量引用不會被替換為變量值,而保持原字符串
???顯示已定義的所有變量:set
??? 刪除變量:unset name

??7.環境變量

???變量聲明、賦值:
????export name=VALUE
????declare -x name=VALUE
???變量引用:$name,${name}
???顯示所有環境變量:
????Env
????Printenv
????Export
????Declare
???刪除變量
????Unset name
??? bash內建的環境變量
????PATH
????SHELL
????USER
????UID
????HOME
????PWD
????SHLVL
????LANG
????MAIL
????HOSTNAME
????HISTSIZE

??8.只讀變量

???只讀變量:只能聲明,但不能修改和刪除
?? ?聲明只讀變量:
?? ??readonly name
?? ??declare -r name
???查看只讀變量:
???? readonly –p
???位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
????$1, $2, ...:對應第1、第2等參數,shift [n]換位置
????$0: 命令本身
????$: 傳遞給腳本的所有參數,全部參數合為一個字符串
????$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
????$#: 傳遞給腳本的參數的個數
????$@ $
只在被雙引號包起來的時候才會有差異
????set -- 清空所有位置變量

?10、 退出狀態

??進程使用退出狀態來報告成功或失敗
??? 0 代表成功,1-255代表失敗
??$? 變量保存最近的命令退出狀態
??例如:
??? Ping 172.28.250.1
??? Echo $?

?11、 退出狀態碼

??Bash自定義退出狀態碼
??exit [n]:自定義退出狀態碼
??註意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出 狀態取決於exit命令後面的數字
??註意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼 取決於腳本中執行的最後一條命令的狀態碼

?12、 算術運算

??Bash中的算術運算:help let
???+ ,-,*,/,%取模(取余),**(乘方)
??實現算術運算:
???(1) let var=算術表達式
???(2) var=$[算術表達式]
???(3) var=$((算術表達式))
???(4) var=$(expr arg1 arg2 arg3 ...)
???(5) declare –i var = 數值
???(6) echo ‘算術表達式’ | bc
????? 乘法符號有些場景中需要轉義,如*
???Bash有內建的隨機數生成器:$RSNDOM(0-32767)
?????echo $[$RANDOM%50] :0-49之間隨機數

?13、 賦值

??增強型賦值
???+=, -=, *=, /=, %=
??let varOPERvalue
???例如:let count+=3
???自加 3後自賦值
??自增,自減:
??? let var+=1
??? let var++
??? let var -=1
??? et var--

?14、邏輯運算

??true, false
???1 ,0
?? 與:
??? 1 與 1 = 1
??? 1 與 0 = 0
??? 0 與 1 = 0
??? 0 與 0 = 0
?? 或:
???1 或 1 = 1
???1 或 0 = 1
???0 或 1 = 1
???0 或 0 = 0
??非:!
??? ! 1 = 0
??? ! 0 = 1
??短路運算:
???短路與
???? 第一個為0,結果必定為0
???? 第一個為1,第二個必須要參與運算
???短路或
???? 第一個為1,結果必定為1
???? 第一個為0,第二個必須要參與運算
???異或:^
????異或的兩個值,相同為假,不同為真

?15、條件測試

??判斷某需求是否滿足,需要由測試機制來實現
??專用的測試表達式需要由測試命令輔助完成測試過程
??評估布爾聲明,以便用在條件性執行中
???若真,則返回0
???若假,則返回1
??測試命令:
???test EXPRESSION
???[ EXPRESSION ]
???[[ EXPRESSION ]]
註意:表達式前後與中括號之間一定要有一個空格expression的意思是表達式

?16、條件性的執行操作符

??根據退出狀態而定,命令可以有條件地運行
???&& 代表條件性的AND THEN(與)
??? || 代表條件性的OR ELSE(或)
??例如:
??? Grep -q dog /app/cc && echo 成功
??? Ping -c1 -W2 172.18.0.1 &> /dev/null && echo ping通了

?17、test命令

??長格式的例子:
???test "$A" == "$B" && echo "Strings are equal"
????若A=B ,則輸出strings are equal
??? test “$A” -eq “$B” && echo "Integers are equal"
???? 若A不等於B,則輸出integers are equal
?? 簡寫格式的例子:
??? [ "$A" == "$B" ] && echo "Strings are equal"
??? [ "$A" -eq "$B" ] && echo "Integers are equal"

?18、bash的數值測試

??-v VAR
???變量VAR 是否存在
??數值測試:
???-gt 是否大於
???-ge 是否大於等於
???-eq 是否等於
???-ne 是否不等於
???-lt 是否小於
???-le 是否小於等於
??字符串測試:
???== 是否等於
???> ascii碼是否大於ascii碼
???< 是否小於
???!= 是否不等於
??? =~ 左側字符串是否能夠被右側的PATTERN所匹配
?????註意: 此表達式一般用於[[ ]]中;擴展的正則表達式
???-z "STRING“ 字符串是否為空,空為真,不空為假
???-n "STRING“ 字符串是否不空,不空為真,空為假
????(註意:用於字符串比較時的用到的操作數都應該使用引號)

?19、bash的文件測試(下列FILE均代表文件路徑)

??存在性測試
??? -a FILE:同-e
??? -e FILE: 文件存在性測試,存在為真,否則為假
??存在性及類別測試
???-b FILE:是否存在且為塊設備文件
???-c FILE:是否存在且為字符設備文件
???-d FILE:是否存在且為目錄文件
???-f FILE:是否存在且為普通文件
???-h FILE 或 -L FILE:存在且為符號鏈接文件
???-p FILE:是否存在且為命名管道文件
???-S FILE:是否存在且為套接字文件
??文件權限測試
??? -r FILE:是否存在且可讀
???-w FILE: 是否存在且可寫
???-x FILE: 是否存在且可執行
??文件特殊權限測試:
???-u FILE:是否存在且擁有suid權限
???-g FILE:是否存在且擁有sgid權限
???-k FILE:是否存在且擁有sticky權限
??文件大小測試:
??? -s FILE:是否存在且非空
??文件是否打開:
???-t fd: fd表示文件描述符是否已經打開且與某終端相關
???-N FILE:文件自動上一次被讀取之後是否被修改過
???-O FILE:當前有效用戶是否為文件屬主
???-G FILE:當前有效用戶是否為文件屬組
??雙目測試:
???FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設 備上的相同inode
???FILE1 -nt FILE2: FILE1是否新於FILE2(mtime)
???FILE1 -ot FILE2: FILE1是否舊於FILE2

?20、bash的組合測試條件

??第一種方式:
???COMMAND1 && COMMAND2 並且
???COMMAND1 || COMMAND2 或者
???! COMMAND 非
????如:[[ -r FILE ]] && [[ -w FILE ]]
?? 第二種方式:
???EXPRESSION1 -a EXPRESSION2 並且
???EXPRESSION1 -o EXPRESSION2 或者
???! EXPRESSION
????必須使用測試命令進行
???示例:
????[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

三、使用read命令來接受輸入

?使用read來把輸入值分配給一個或多個shell變量
??-p 指定要顯示的提示
??-s 靜默輸入,一般用於密碼
??-n N 指定輸入的字符長度N
??-d ‘字符’ 輸入結束符
??-t N TIMEOUT為N秒
??read 從標準輸入中讀取值,給每個單詞分配一個變量
??所有剩余單詞都被分配給最後一個變量
??read -p “Enter a filename: “ FILE

四、BASH

?1、bash如何展開命令行

??把命令行分成單個命令詞
??展開別名
??展開大括號的聲明({})
??展開波浪符聲明(~)
??命令替換$() 和 ``)
??再次把命令行分成命令詞
??展開文件通配(* 、?、[abc]等等)
??準備I/0重導向()
??運行命令

?2、bash防止擴展

??1.反斜線(\)會使後面的特殊符號字符依然以字符串的形式輸出,而不是輸出特殊的含義,例如$可以用來調用變量的值,在前面加\則只輸出$,而不會調用後面字符的變量值,但是一個\只能轉義一個字符
??? $ echo Your cost: \$5.00
???Your cost: $5.00
??2.加引號來防止擴展
???單引號(’’)防止單引號內的所有字符的擴展
???雙引號(””)也防止所有擴展,但以下情況例外:
?????$(美元符號) - 變量擴展
?????`(反引號) - 命令替換
?????\(反斜線) - 禁止單個字符擴展
?????!(嘆號) - 歷史命令替換

?3、bash的配置文件

?? Bash的配置文件會在每次用戶登錄時被系統讀取,全局配置下的文件,所有用戶通用,個人家目錄下的配置文件則是用戶自己的一些個性化配置
??按生效範圍劃分,存在兩類:
???全局配置:
???? /etc/profile
???? /etc/profile.d/*.sh
???? /etc/bashrc
???個人配置:
???? ~/.bash_profile
????~/.bashrc

?4、shell登錄兩種方式

??1.交互式登錄:

???(1) 直接通過終端輸入賬號密碼登錄
???(2) 使用“su - UserName” 切換的用戶
????交互式登錄讀取配置文件的順序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

??2.非交互式登錄:

???(1)su UserName
???(2)圖形界面下打開的終端
???(3)執行腳本
???(4)任何其它的bash實例
????執行順序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

?5、登錄時配置文件的分類與作用

??1.按功能劃分,存在兩類

???Profile類和bashrc類
????Profile類:為交互式登錄的shell提供配置
?????全局:/etc/profile, /etc/profile.d/*.sh
????? 個人:~/.bash_profile
?????功用:
??????(1) 用於定義環境變量
??????(2) 運行命令或腳本
???? Bashrc類:為非交互式和交互式登錄的shell提供配置
?????全局:/etc/bashrc
?????個人:~/.bashrc
?????功用:
??????(1) 定義命令別名和函數
??????(2) 定義本地變量

?6、編輯配置文件生效

??修改profile和bashrc文件後需生效
??兩種方法:
???1.重新啟動shell進程
???2 . 或source
?????Source與 . 在當前shell下執行腳本,用來設置環境變量及別名,函數等
?????/bin/bash或路徑方式執行腳本使子shell在執行,子shell可以繼承父shell的環境變量,但在腳本中設置的變量,均不會影響父shell

?7、bash退出任務

??保存在~/.bash_logout文件中(用戶)
??在退出登錄shell時運行
??用於
???創建自動備份
???清除臨時文件

?8、$-變量

??h:hashall,打開這個選項後,Shell 會將命令所在的路徑 hash下來,避免每次都要查詢。通過set +h將h選項關閉
??i:interactive-comments,包含這個選項說明當前的 shell 是一個交互式的 shell。所謂的交互式shell,在腳本中,i選項 是關閉的。
??m:monitor,打開監控模式,就可以通過Job control來控制 進程的停止、繼續,後臺或者前臺執行等。
??B:braceexpand,大括號擴展
??H:history,H選項打開,可以展開歷史列表中的命令,可以 通過!感嘆號來完成,例如“!!”返回上最近的一個歷史命令, “!n”返回第 n 個歷史命令

五、判斷語句

?1、單if語句

??語法格式:
??? if 條件 ;then
???? 命令塊1(可以是多個命令)
??? else
????命令塊2(可以是多個命令)
??? Fi
如果符合該條件,則執行命令塊1處的命令不執行命令塊2處的命令,如果條件不符合,則跳過命令塊1處的命令不執行,直接執行命令塊2處的命令,條件多為一個判斷命令,返回值為0(true)執行命令塊1,返回值為1(false)執行命令塊2
??例如:
??? if $(id $1 &> /dev/null);then
???? echo "$1 alread exist"
???? exit 1
???else
????useradd $1
???fi

?2、多if語句

??語法格式:
??? If 條件1 ;then
???? 命令塊1
??? Elif 條件2 ;then
???? 命令塊2
??? Elif 條件3;then
???? 命令塊3
???……
??? Elif 條件n;then
???? 命令塊n
??? Else
???? 命令塊n+1
??? If
執行順序是,先判斷條件1,返回值為true則執行命令塊1,然後退出if語句
如果條件1,返回值為false,則繼續判斷條件2,返回值為true,則執行命令塊2,然後退出if語句,若條件2 返回值為false,則繼續判斷條件3……,如果所有條件返回 值都為false,則執行else後面的命令塊n+1,然後退出if語句
?? 例如:
??? #!/bin/bash
??? if [ $1 -lt 3 ];then
???? echo redhat
???elif [ $1 -eq 3 ];then
????echo green
???elif [ $1 -gt 3 -a $1 -lt 5 ];then
??? ?echo yellow
???else
???? echo white
???fi

?3、case語句

?? Case 變量 in
????變量值1)命令塊1;;
????變量值2)命令塊2;;
????變量值4)命令塊3;;
????變量值n)命令塊n;;
?? Esac
執行順序是,先調用一個變量,然後判斷變量值是否符合變量值1,如果相等,則執行命令塊1,如果不符合則判斷變量值2,……一直到變量值n,如果都不符合則 一條命令都不執行
??例如:
???case $1 in
????1)echo redhat;;
????2)echo yellow;;
????3)echo green;;
???? *)echo blue;;
??? Esac

六、 文件查找

??在文件系統上查找符合條件的文件
??文件查找:locate 和find
??非實時查找(數據庫查找):locate
??實時查找:find

?1、 locate查找

??1.查詢系統上預建的文件索引數據庫

???/var/lib/mlocate/mlocate.db

??2. 依賴於事先構建的索引

???索引的構建是在系統較為空閑時自動進行(周期性任務),管理 員手動更新數據庫(updatedb)

??3. 索引構建過程需要遍歷整個根文件系統,極消耗資源

??4.工作特點:

???查找速度快
???模糊查找
???非實時查找
???搜索的是文件的全路徑,不僅僅是文件名
???可能只搜索用戶具備讀取和執行權限的目錄

??5.locate命令的使用方法

??? Locate 選項word
????-i 不區分大小寫的搜索
????-n N 只列舉前N個匹配項目
????-r 正則 使用正則表達式來進行模糊查找
??? 例:
????Locate conf:搜索名稱或路徑中帶有conf的文件
????Locate -r ‘\.conf$’ :使用正則表達式來搜索以“.conf”結尾的文件

?2、 find實時查找工具

??1. 實時查找工具,通過遍歷指定路徑完成文件查找

??2. 工作特點:

???查找速度略慢
???精確查找
???實時查找
???可能只搜索用戶具備讀取和執行權限的目錄

??3. 語法

???Find [選項] 參數 [查找路徑] [查找條件] [處理動作]
????查找路徑:指定具體目標路徑;默認為當前目錄
????查找條件:指定的查找標準,可以文件名、大小、類型、 權限等標準進行;默認為找出指定路徑下的所有文件
????處理動作:對符合條件的文件做操作,默認輸出至屏幕

??4. 查找條件

???1、指搜索層級

????-maxdepth level 最大搜索目錄深度,指定目錄為第1級
????-mindepth level 最大搜索目錄深度

???2、 根據文件名和inode查找:

???? -name “文件名稱”:支持使用glob
??????*, ?, [], [^]
???? -iname "文件名稱":不區分字母大小寫
???? -inum n 按inode號查找
???? -samefile name 相同inode號的文件
???? -links n 鏈接數為n的文件
???? -regex "PATTERN":以PATTERN匹配整個文件路徑字 符串,而不僅僅是文件名稱
????例:
?????find -name snow.png 搜索名為snow.png的文件
?????find -iname snow.png 不分大小寫地搜索名為snow.png、Snow.png、 SNOW.PNG等等的文件
?????find / -name “.txt” 搜索/下文件名以.txt結尾的文件
?????find /var –name “
log*” 在/var目錄下搜索名字裏包含log的文件

???3、 根據屬主、屬組查找:

???? -user USERNAME:查找屬主為指定用戶(UID)的文件
???? -group GRPNAME: 查找屬組為指定組(GID)的文件
???? -uid UserID:查找屬主為指定的UID號的文件
???? -gid GroupID:查找屬組為指定的GID號的文件
???? -nouser:查找沒有屬主的文件
???? -nogroup:查找沒有屬組的文件
???? 例:
???? ?find -user joe -group joe 搜索被用戶joe 以及組群joe所擁有的文件
???? ?find / -user joe -o -uid 500 在/目錄下搜索屬主為joe或屬主的uid為500的文件

???4、根據文件類型查找

?????-type type(對應以下類型):
??????f: 普通文件
??????d: 目錄文件
??????l: 符號鏈接文件
??????s:套接字文件
??????b: 塊設備文件
??????c: 字符設備文件
??????p: 管道文件
????? 例:
???????find / -name shell -type f 搜索/目錄下所有文件名為shell的普通文件

???5、組合條件:

????與:-a
????或:-o
????非:-not, !
????德·摩根定律:
?????(非 A) 或 (非 B) = 非(A 且 B)
?????(非 A) 且 (非 B) = 非(A 或 B)
????例:
?????!A -a !B = !(A -o B)
?????!A -o !B = !(A -a B)
????示例:
??????find -user joe -not -group joe 在當前目錄下搜索屬主是Joe但屬組不是joe的所有文件及目錄
??????find -user joe -o -user jane 在當前目錄下搜索屬主是joe或jane的所有文件及目錄
??????find -not \( -user joe -o -user jane \) 搜索當前目錄下屬主既不是joe也不是Jane的所有文件及目錄
??????找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
???????find /tmp \( -not -user root -a -not -name ‘f*‘ \) -ls
???????find /tmp -not \( -user root -o -name ‘f*‘ \) –ls

???6、排除目錄

????示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf後 綴的文件
?????find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
?????find /etc (–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a prune –o name “*.conf”

???7、根據文件大小來查找

????-size [+|-]#UNIT
?????常用單位:K,M,G c(byte)
????#UNIT: (#-1, #] (#:數字;unit:單位)
?????如:6k 表示(5k,6k]
????-#UNIT:[0,#-1]
?????如:-6k 表示[0,5k]
????+#UNIT:(#,∞)
?????如:+6k 表示(6k,∞)

???8、根據時間戳:

????以“天”為單位
????? -atime e [+|-]#,
?????#: [#,#+1)
?????+#: [#+1, ∞ ]
?????-#: [0,#)
?????-mtime
?????-ctime
???? 以“分鐘”為單位
?????-amin
?????-mmin
?????-cmin

???8、根據權限查找:

????-perm [/|-]MODE
?????MODE: 精確權限匹配
?????/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配 即可,或關系,+ 從centos7開始淘汰
?????-MODE:每一類對象都必須同時擁有指定權限,與關系
?????0 表示不關註
?????find -perm 755 會匹配權限模式恰好是755的文件
?????只要當任意人有寫權限時,find -perm +222就會匹配
?????只有當每個人都有寫權限時,find -perm -222才會匹配
?????只有當其它人(other)有寫權限時,find -perm -002才 會匹配

??5.處理動作

????-print:默認的處理動作,顯示至屏幕
????-ls:類似於對查找到的文件執行“ls -l”命令
????-delete:刪除查找到的文件
????-fls file:查找到的所有文件的長格式信息保存至指定文件中
????-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND 指定的命令,對於每個文件執行命令之前,都會交互式要求 用戶確認
????-exec COMMAND {} \; 對查找到的每個文件執行由 COMMAND指定的命令
??????{}: 用於引用查找到的文件名稱自身。{}與\之間必須有一個空格
???find傳遞查找到的文件至後面指定的命令時,查找到所有符合 條件的文件一次性傳遞給後面的命令
????例:find -type f -name ".sh" -exec chmod a+x {} \
???????在當前文件下查找出以.sh結尾的所有文件,並給她們加上執行權限
??????find -name "
.conf" -exec cp -i {} {}.bak \;
???????備份所有以conf結尾的所有文件並改名添加.bak這個擴展名

??6.參數替換xargs

????由於很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所有就有了xargs命令,xargs用於產生某個命令的參數,xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成為arguments
????註意:文件名或者是其他意義的名詞內含有空格符的情況
????有些命令不能接受過多參數,命令執行可能會失敗,xargs可 以解決
????示例:
?????ls f\* |xargs rm
?????find /sbin -perm +700 |ls -l 這個命令是錯誤的
?????find /sbin -perm +7000 | xargs ls –l
?????find和xargs格式:find | xargs COMMAND

??7.find示例:

???? find -name “\.conf” -exec cp {} {}.orig \;
?????備份配置文件,添加.orig這個擴展名
???? find /tmp -ctime +3 -user joe -ok rm {} \;
?????提示刪除存在時間超過3天以上的joe的臨時文件
???? find ~ -perm -002 -exec chmod o-w {} \;
?????在你的主目錄中尋找可被其它用戶寫入的文件
????find /data –type f -perm 644 -name “\
.sh” –exec chmod 755 {} \;
????find /home –type d -ls

七、 壓縮、解壓縮及歸檔工具

???compress/uncompress: .Z
???gzip/gunzip: .gz
???bzip2/bunzip2: .bz2
???xz/unxz: .xz
???zip/unzip
???tar
???cpio

?1、 Compress壓縮工具

??compress srcfile 將源文件壓縮成壓縮包,源文件消失
??compress -v srcfile 或compress -v -d dstfile.Z 壓縮或解壓縮時顯示詳細信息
??compress -c srcfile > dstfile.Z 將源文件壓縮成壓縮包,源文件保留
??compress -d dstfile.Z 或 uncompress dstfile.Z 將壓縮包解壓成源文件,壓縮包消失
??compress -d -c dstfile.Z > srcfile 或 zcat dstfile.Z > srcfile 將壓縮包解壓成源文件,壓縮包保留

?2、 Gzip壓縮工具

??gzip srcfile 將源文件壓縮成壓縮包,源文件消失
??gzip -c srcfile > dstfile.gz 將源文件壓縮成壓縮包,源文件保留
??gzip -d dstfile.gz 或gunzip dstfile.gz 將壓縮包解壓成源文件,壓縮包消失
??gzip -d -c dstfile.gz > srcfile 或 zcat dstfile.gz > srcfile 將壓縮包解壓成源文件,壓縮包保留
??gzip -# srcfile (#即1-9,表示壓縮比,數字越大壓縮比越高,默認為6)

?3、 Bzip2

??bzip2 srcfile 將源文件壓縮成壓縮包,源文件消失
??bzip2 -k srcfile 將源文件壓縮成壓縮包,源文件保留且權限不變
??bzip2 -c srcfile > dstfile.bz2 將源文件壓縮成壓縮包,源文件保留但權限根據umask值而改變
??bzip2 -d dstfile.bz2 或bunzip dstfile.bz2 將壓縮包解壓成源文件,壓縮包消失
??bzip2 -k -d dstfile.bz2 或bunzip -k dstfile.bz2 將壓縮包解壓成源文件,壓縮包保留且權限不變
??bzip2 -d -c dstfile.bz2 > srcfile 或 bunzip -c dstfile.bz2 > srcfile 將壓縮包解壓成源文件,壓縮包保留但權限根據umask值而改變
??bzip2 -# srcfile (#即1-9,表示壓縮比,數字越大壓縮比越高,默認為9)
??bzcat dstfile.bz2 可以預覽解壓後的內容,配合> 也能解壓,但權限會根據umask值而改變

?4、 Xz壓縮工具

??Xz [option] ……file ……
???-k: keep, 保留原文件
???-d:解壓縮
???-#:1-9,壓縮比,默認為6
???xzcat: 不顯式解壓縮的前提下查看文本文件內容

?5、 Zip打包壓縮工具

??zip -r dstfile.zip srcfile 打包srcfile並壓縮成dstfile
??zip scrfile 壓縮srcfile文件,源文件不存在
??zip -r config.zip /etc/passwd /etc/group /etc/shadow /etc/gshadow 打包壓縮多個源文件,源文件以空格相隔
??cat /var/log/messages | zip messages – 把/var/log/messages裏面的內容壓縮給當前目錄下的messages,源文件依舊存在
??unzip config.zip 解包解壓縮 壓縮包不存在
??unzip -p conf.zip > config1 解壓config.zip裏的內容到config1,壓縮文件依舊存在

?6、 Tar工具

??tar -tf mage.tar.xz 預覽壓縮包的文件列表
??tar -rf mage.tar /path/newfile 往tar包中增強文件(註意只能對tar包增加文件,而不能對壓縮包增加)
??tar -cf mage.tar filename1 filename2 [filenameN] 將多個文件打包至mage.tar
??tar -zcf mage.tar.gz filename1 filename2 [filenameN] 將多個文件打包並用gzip壓縮為mage.tar.gz
??tar -jcf mage.tar.bz2 filename1 filename2 [filenameN] 將多個文件打包並用bzip2壓縮為mage.tar.bz2
??tar -Jcf mage.tar.xz filename1 filename2 [filenameN] 將多個文件打包並用xz壓縮為mage.tar.xz
??tar -xf mage.tar 解壓tar包的所有文件到當前目錄
??tar -xf mage.tar.xz filename 僅將壓縮包中的其中一個文件filename解壓到當前目錄
??tar -zxf mage.tar.gz 解壓gz的壓縮包到當前目錄
??tar -jxf mage.tar.bz2 解壓bzip2的壓縮包到當前目錄
??tar -Jxf mage.tar.xz 解壓xz的壓縮包到當前目錄
??tar -zxf mage.tar.gz -C /tmp 解壓gz的壓縮包到/tmp目錄
??tar -zvxf mage.tar.gz 解壓gz的壓縮包到當前目錄並顯示詳細過程
??tar zcvf mage.tar.gz -T yasuolist.txt -X paichu.txt
???-T 指定需要打包並壓縮的文件列表,每個文件路徑一行
???-X 指定要排除的文件列表,每個文件一行

?7、 分割合並壓縮包

??split -b 2K -d etc.tgz 4 將壓縮包以2K為單位分割為4份
??cat 40* > mage.tgz 將以40開頭命名的多個分割包合並為mage.tgz

?8、 Cpio

??復制 從或到文件
??cpio命令是通過重定向的方式將文件進行打包備份,還原恢復 的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。
??cpio [選項] > 文件名或者設備名 :
??cpio [選項] < 文件名或者設備名
選項
??-o 將文件拷貝打包成文件或者將文件輸出到設備上
??-i 解包,將打包文件解壓或將設備上的備份還原到系統
??-t 預覽,查看文件內容或者輸出到設備上的文件內容
??-v 顯示打包過程中的文件名稱。
??-d 解包生成目錄,在cpio還原時,自動的建立目錄
??-c 一種較新的存儲方式
?? 例:
??? 將etc目錄備份:
????find ./etc -print |cpio -ov >etc.cpio
???內容預覽
????cpio –tv < etc.cpio
???要解包文件
????cpio –idv < etc.cpio

七、 文本處理sed

??Stream EDitor, 行編輯器
??sed是一種流編輯器,它一次處理一行內容。處理時,把當前 處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成後 ,把緩沖區的內容送往屏幕。然後讀入下行,執行下一個循 環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間 清空模式空間,但不會清空保留空間。這樣不斷重復,直到 文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸 出。

?1、功能:

??主要用來自動編輯一個或多個文件,簡化對文件的反復 操作,編寫轉換程序等

?2、用法

??sed [option]... ‘script‘ inputfile...
???常用選項
????-n:不輸出模式空間內容到屏幕,即不自動打印
????-e: 多點編輯
????-f:/PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本
????-r: 支持使用擴展正則表達式
????-i.bak: 備份文件並原處編輯
??? Script:
????Script ‘地址 編輯命令’,與vim的擴展命令行裏面的一些格式有些相似
????地址定界:
?????(1) 不給地址:對全文進行處理
?????(2) 單地址:
??????#: 指定的行
??????/pattern/:被此處模式所能夠匹配到的每一行
?????(3) 地址範圍:
??????#1,#2 從第#1行到第#2行
??????#1,+#2 從第#1行開始,到從第#1行數#2行結束
??????/pat1/,/pat2/ 從第一次匹配到pat1至第一次匹配到pat2
??????#,/pat1/ 從第#行開始至第一次匹配到path1為止
?????(4) ~:步進 1~2 奇數行 2~2 偶數行
????編輯命令:
????? d: 刪除模式空間匹配的行,並立即啟用下一輪循環
?????p:打印當前模式空間內容,追加到默認輸出之後
?????a [\]text:在指定行後面追加文本 支持使用\n實現多行追加
?????i [\]text:在行前面插入文本
?????c [\]text:替換行為單行或多行文本
?????w /path/somefile: 保存模式匹配的行至指定文件
?????r /path/somefile:讀取指定文件的文本至模式空間中 匹配到的行後
?????=: 為模式空間中的行打印行號
     !:模式空間中匹配行取反處理
     s///:查找替換,支持使用其它分隔符 s@@@,s###
     替換標記
      g: 行內全局替換
      p: 顯示替換成功的行
      w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中

 3、 示例:

  Sed -n ‘2p’ cc 只顯示第2行
  sed -n ‘1,4p‘ cc 顯示1到4行
  sed -n ‘1,+2p‘ cc 顯示1至3行
  sed -n ‘/root/p‘ cc 顯示匹配到root的行
  sed -n ‘2,/root/p‘ cc 顯示從第二行,至第一個次匹配到root的行
  sed -n ‘/^$/=‘ cc 顯示空行的行號
  sed -n -e ‘/root/p‘ -e ‘/cat/=‘ cc 顯示匹配到root的行以及匹配到cat的行號
  sed ‘/root/i\superman’ /etc/passwd 在所有匹配到root的行前插入superman
  sed ‘/root/c\superman’ /etc/passwd 代替行
  sed ‘/root/a\superman’ /etc/passwd行後

續寫vim,shell腳本基礎編輯,read命令,if與case判斷語句,文件查找方式,壓縮與解壓,