一、find
語法格式
find [path] [expression]
參數(shù)說明 :
path 是要查找的目錄路徑,可以是一個(gè)目錄或文件名,也可以是多個(gè)路徑,多個(gè)路徑之間用空格分隔,如果未指定路徑,則默認(rèn)為當(dāng)前目錄。
expression 是可選參數(shù),用于指定查找的條件,可以是文件名、文件類型、文件大小等等。
1. 常用expression
以下列出最常用expression的部分:
- -name pattern:按文件名查找,支持使用通配符 * 和 ?。
- -type type:按文件類型查找,可以是 f(普通文件)、d(目錄)、l(符號(hào)鏈接)等。
- -size [+-]size[cwbkMG]:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,單位可以是 c(字節(jié))、w(字?jǐn)?shù))、b(塊數(shù))、k(KB)、M(MB)或 G(GB)。
- -mtime days:按修改時(shí)間查找,支持使用 + 或 - 表示在指定天數(shù)前或后,days 是一個(gè)整數(shù)表示天數(shù)。
- -user username:按文件所有者查找。
- -group groupname:按文件所屬組查找。
2. 時(shí)間參數(shù)
find 命令中用于時(shí)間的參數(shù)如下:
- -amin n:查找在 n 分鐘內(nèi)被訪問過的文件。
- -atime n:查找在 n*24 小時(shí)內(nèi)被訪問過的文件。
- -cmin n:查找在 n 分鐘內(nèi)狀態(tài)發(fā)生變化的文件(例如權(quán)限)。
- -ctime n:查找在 n*24 小時(shí)內(nèi)狀態(tài)發(fā)生變化的文件(例如權(quán)限)。
- -mmin n:查找在 n 分鐘內(nèi)被修改過的文件。
- -mtime n:查找在 n*24 小時(shí)內(nèi)被修改過的文件。
在這些參數(shù)中,n 可以是一個(gè)正數(shù)、負(fù)數(shù)或零。正數(shù)表示在指定的時(shí)間前修改或訪問過的文件,負(fù)數(shù)表示在指定的時(shí)間內(nèi)修改或訪問過的文件,零表示在當(dāng)前時(shí)間點(diǎn)上修改或訪問過的文件。
例如:-mtime 0 表示查找今天修改過的文件,-mtime -7 表示查找過去一周以內(nèi)修改過的文件。
關(guān)于時(shí)間 n 參數(shù)的說明:
- +n:查找比 n 天前更早的文件或目錄。
- -n:查找在 n 天內(nèi)更改過屬性的文件或目錄。
- n:查找在 第 n 天前(指定那一天)更改過屬性的文件或目錄。
3. 其他選項(xiàng)參數(shù)
3.1 查找深度
- -maxdepth levels
Descend at most levels (a non-negative integer) levels of directories below the starting-points. Using -maxdepth 0 means only apply the tests and actions to the starting-points themselves. - -mindepth levels
Do not apply any tests or actions at levels less than levels (a non-negative integer). Using -mindepth 1 means process all files except the starting-points.
3.2 執(zhí)行命令
- -exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ‘;’ is encountered. The string ‘{}’ is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a ‘\’) or quoted to protect them from expansion by the shell.
示例:
# 查找當(dāng)前目錄下當(dāng)天修改過的txt文件并刪除
find . -maxdepth 1 -type f -name "\*.txt" -mtime -1 -exec rm -rf '{}' \;
# 查找當(dāng)前目錄下近5天內(nèi)修改過的txt文件并拷貝到/tmp目錄下
find . -maxdepth 1 -type f -name "\*.txt" -mtime -5 -exec cp '{}' /tmp/ \;
Notice that the braces are enclosed in single quote marks to protect them from interpretation as shell script punctuation. The semicolon is similarly protected by the use of a backslash, though single quotes could have been used in that case also.
注意:cp、mv不能直接使用xargs。
示例:$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir
此處的xargs將會(huì)構(gòu)建如下命令:
$ mv 1.csv 2.csv 3.csv ... -t some_dir
如果直接使用cp或mv,會(huì)導(dǎo)致目標(biāo)目錄無法匹配,因此,需使用-t指定目標(biāo)目錄
二、sed
Vim 采用的是交互式文本編輯模式,可以用鍵盤命令來交互性地插入、刪除或替換數(shù)據(jù)中的文本。但 sed 命令不同,它采用的是流編輯模式,最明顯的特點(diǎn)是,在 sed 處理數(shù)據(jù)之前,需要預(yù)先提供一組規(guī)則,sed 會(huì)按照此規(guī)則來編輯數(shù)據(jù)。
vim 中一些常用操作:
- gg(命令模式下跳轉(zhuǎn)文件開頭)
- G(命令模式下跳轉(zhuǎn)文件結(jié)尾)
- :%s/vivian/sky/替換每一行的第一個(gè) vivian 為 sky(底線命令模式)
- :%s/vivian/sky/g替換每一行中所有 vivian 為 sky(底線命令模式)
sed 會(huì)根據(jù)腳本命令來處理文本文件中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲(chǔ)在一個(gè)文本文件中,此命令執(zhí)行數(shù)據(jù)的順序如下:
- 每次僅讀取一行內(nèi)容;
- 根據(jù)提供的規(guī)則命令匹配并修改數(shù)據(jù)。注意,sed 默認(rèn)不會(huì)直接修改源文件數(shù)據(jù),而是會(huì)將數(shù)據(jù)復(fù)制到緩沖區(qū)中,修改也僅限于緩沖區(qū)中的數(shù)據(jù);
- 將執(zhí)行結(jié)果輸出。
當(dāng)一行數(shù)據(jù)匹配完成后,它會(huì)繼續(xù)讀取下一行數(shù)據(jù),并重復(fù)這個(gè)過程,直到將文件中所有數(shù)據(jù)處理完畢。
1. 常用命令選項(xiàng)
默認(rèn)情況下,sed 會(huì)在所有的腳本指定執(zhí)行完畢后,會(huì)自動(dòng)輸出處理后的內(nèi)容。
命令選項(xiàng):
- -i:此選項(xiàng)會(huì)直接修改源文件,要慎用。
- -n:默認(rèn)情況下,sed 會(huì)在所有的腳本指定執(zhí)行完畢后,會(huì)自動(dòng)輸出處理后的內(nèi)容,而該選項(xiàng)會(huì)屏蔽啟動(dòng)輸出,需使用 print 命令來完成輸出。
- -e:該選項(xiàng)會(huì)將其后跟的腳本命令添加到已有的命令列表中,即可以通過-e參數(shù)指定多個(gè)命令內(nèi)容。
2. 常用動(dòng)作腳本命令
2.1 s 替換
此命令的基本格式為:
[address]s/pattern/replacement/flags
其中,address 表示指定要操作的具體行,pattern 指的是需要替換的內(nèi)容,replacement 指的是要替換的新內(nèi)容。
此命令中常用的 flags 標(biāo)記如表所示
flags 標(biāo)記 | 功能 |
---|---|
n | 1~512 之間的數(shù)字,表示指定要替換的字符串出現(xiàn)第幾次時(shí)才進(jìn)行替換,例如,一行中有 3 個(gè) A,但用戶只想替換第二個(gè) A,這是就用到這個(gè)標(biāo)記; |
g | 對(duì)數(shù)據(jù)中所有匹配到的內(nèi)容進(jìn)行替換,如果沒有 g,則只會(huì)在第一次匹配成功時(shí)做替換操作。例如,一行數(shù)據(jù)中有 3 個(gè) A,則只會(huì)替換第一個(gè) A; |
p | 會(huì)打印與替換命令中指定的模式匹配的行。此標(biāo)記通常與 -n 選項(xiàng)一起使用。 |
示例:
sed 's/192/10/g' test.txt # 把文件里面的192字符替換為10,不修改原文件,替換結(jié)果輸出到終端
sed -i 's/192/10/g' test.txt # 把文件里面的192字符替換為10,修改原文件
2.2 已匹配字符串標(biāo)記&
& 表示已匹配的字符串標(biāo)記
示例:
sed 's/^/& /g' test.txt # 在每行行首增加一個(gè)空格
sed 's/$/& id /g' test.txt # 在每行末尾增加一個(gè)id字符串
2.3 在當(dāng)前行前后插入文本 a\ 和 i\
a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行,它們的基本格式完全相同,如下所示:
[address]a(或 i)\新文本內(nèi)容
a\ 和 i\ 后面的\可以省略
示例:
sed '/^test/a\this is a test line' file # 在file文件以 test 開頭的行后面追加一行文本
sed '/^test/i\this is a test line' file # 在file文件以 test 開頭的行前面插入一行文本
2.4 p 打印指定行
p 命令表示搜索符號(hào)條件的行,并輸出該行的內(nèi)容,此命令的基本格式為:
[address]p
示例:
sed -n '/xxx/p' test.txt
用 -n 選項(xiàng)和 p 命令配合使用,可以禁止輸出其他行,只打印包含匹配文本模式的行。
2.5 匹配行的方式
默認(rèn)情況下,sed 命令會(huì)作用于文本數(shù)據(jù)的所有行。如果只想將命令作用于特定行或某些行,則必須寫明 address 部分,表示的方法有以下 2 種:
- 以數(shù)字形式指定行區(qū)間;
- 用文本模式指定具體行區(qū)間。
2.5.1 以數(shù)字形式指定行區(qū)間
sed 會(huì)將文本流中的第一行編號(hào)為 1,然后繼續(xù)按順序?yàn)榻酉聛淼男蟹峙湫刑?hào)。
在腳本命令中,指定的地址可以是單個(gè)行號(hào),或是用起始行號(hào)、逗號(hào)以及結(jié)尾行號(hào)指定的一定區(qū)間范圍內(nèi)的行。
示例:
sed -n '1p' test.txt # 打印第一行
sed -n '1,5p' test.txt # 打印第1-5行
可以使用分號(hào)來分隔需要指定的多個(gè)行,示例:
sed -n '1p;$p' test.txt # 打印第一行和最后一行,$符號(hào)映射特殊行——最后一行
2.5.2 用文本模式指定行區(qū)間
sed 允許指定文本模式來過濾出命令要作用的行,格式如下:
/pattern/command
例如想修改用戶 demo 的默認(rèn) shell,可以使用 sed 命令,執(zhí)行命令如下:
sed '/demo/s/bash/csh/' /etc/passwd
輸出指定行:
sed -n '/aaa/p' test.txt
sort命令用于將文本文件內(nèi)容加以排序。
- -n 按算術(shù)值對(duì)字段進(jìn)行數(shù)字排序
- -r 按倒序排序
三、grep
基本格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
1. 常用選項(xiàng)
常用選項(xiàng)及含義:
- -v:列出沒有匹配到的行
- -n:在每一匹配行前列出行號(hào)
- -E, --extended-regexp:將pattern解釋為擴(kuò)展正則表達(dá)式,即強(qiáng)制grep表現(xiàn)為egrep(grep -E等價(jià)于egrep)
2. 示例
grep -v "^$" # 排除空行
grep "^10" test.txt # 匹配以10開頭的
grep "11$" test.txt # 以11結(jié)尾的
grep "[0-9]" test.txt # 匹配數(shù)字
grep "[a-z]" test.txt # 匹配字母
cat -n 打印行號(hào)
egrep選項(xiàng)參數(shù)
- -o, --only-matching
只打印匹配行中匹配(非空)的部分,每個(gè)部分在單獨(dú)的輸出行上。
四、awk
和 sed 命令類似,awk 命令也是逐行掃描文件(從第 1 行到最后一行),尋找含有目標(biāo)文本的行,如果匹配成功,則會(huì)在該行上執(zhí)行用戶想要的操作;反之,則不對(duì)行做任何處理。
此命令的設(shè)計(jì)者有 3 位,他們的姓分別是 Aho、Weingberger 和 Kernighan,awk 就取自這 3 為大師姓的首字母。
基本格式:
awk [選項(xiàng)參數(shù)] '腳本命令' 文件名
標(biāo)準(zhǔn)輸出 | awk [選項(xiàng)參數(shù)] '腳本命令' # 如cat test.txt | awk '{print $1}'
1. 常用選項(xiàng)參數(shù)
常用選項(xiàng)及含義:
- -F fs:指定以 fs 作為輸入行的分隔符,awk 命令默認(rèn)分隔符為空格或制表符。
- -v var=value:賦值一個(gè)用戶定義變量,該變量可在腳本命令中使用。
2. 腳本命令
基本格式:
'匹配規(guī)則{執(zhí)行命令}'
這里的匹配規(guī)則,和 sed 命令中的 address 部分作用相同,用來指定腳本命令可以作用到文本內(nèi)容中的具體行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正則表達(dá)式指定。另外需要注意的是,整個(gè)腳本命令是用單引號(hào)(‘’)括起,而其中的執(zhí)行命令部分需要用大括號(hào)({})括起來。
在 awk 程序執(zhí)行時(shí),如果沒有指定執(zhí)行命令,則默認(rèn)會(huì)把匹配的行輸出;如果不指定匹配規(guī)則,則默認(rèn)匹配文本中所有的行。
3. 腳本命令中常見的內(nèi)建變量
默認(rèn)情況下,awk 會(huì)將如下變量分配給它在文本行中發(fā)現(xiàn)的數(shù)據(jù)字段:
- $0 代表整個(gè)文本行;
- $n 代表文本行中的第 n 個(gè)數(shù)據(jù)字段,字段間由FS分隔。
其他內(nèi)建變量:文章來源:http://www.zghlxwxcb.cn/news/detail-705929.html
- FS 字段分隔符(默認(rèn)是任何空格)
- NF 一條記錄的字段的數(shù)目,$NF表示匹配文本行的最后一個(gè)字段
- NR 已經(jīng)讀出的記錄數(shù),就是行號(hào),從1開始
4. 實(shí)例
awk '{print $1}' test.txt # 打印第一列
awk '{print $NF}' test.txt # 打印最后一列
awk -F: '{print $1}' /etc/passwd # 以:作為分隔符打印第一列,取出系統(tǒng)用戶名
awk '{print "01: "$NF}' test.txt # 打印最后一列,awk中可以使用""添加輸出內(nèi)容
df -h 查看磁盤占用的空間文章來源地址http://www.zghlxwxcb.cn/news/detail-705929.html
到了這里,關(guān)于【Linux編程Shell自動(dòng)化腳本】03 shell四劍客(find、sed、grep、awk)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!