目標
使用cut可以切割提取指定列\字符\字節的數據
介紹
cut
譯為“剪切, 切割” , 是一個強大文本處理工具,它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本,然后按列劃分字段并進行提取、輸出等操作。
語法
cut [options] filename
options參數說明
選項參數 | 功能 |
---|---|
-f 提取范圍 | 列號,獲取第幾列 |
-d 自定義分隔符 | 自定義分隔符,默認為制表符。 |
-c 提取范圍 | 以字符為單位進行分割 |
-b 提取范圍 | 以字節為單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標志。 |
-n | 與“-b”選項連用,不分割多字節字符; |
提取范圍說明
提取范圍 | 說明 |
---|---|
n- | 提取指定第n列或字符或字節后面所有數據 |
n-m | 提取指定第n列或字符或字節到第m列或字符或字節中間的所有數據 |
-m | 提取指定第m列或字符或字節前面所有數據 |
n1,n2,... | 提前指定枚舉列的所有數據 |
示例:切割提取指定列數據
cut1.txt文件數據準備
touch cut1.txt
編輯文件添加內容
AA itxinzhi 11 XX
BB itcast 22 XXX
CC Shell 33 XXXX
DD it 44 XXXXXXX
提取文件中第一列數據
cut cut1.txt -d " " -f 1
提取文件中第一列,第三列, 枚舉查找
cut cut1.txt -d " " -f 1,3
提取文件中第二列,第三列,第四列, 范圍查找
cut cut1.txt -d " " -f 2-5
提取文件中第一列后面所有列的數據
cut cut1.txt -d " " ?-f 2-
提起文件中結束列前面所有列的數據
cut -d " " -f -2 cut1.txt
# -2 提取指定列前面所有列數據
運行效果
示例: 切割提取指定字符數據
提取每行前4個字符
cut cut1.txt -c1-4
運行效果
提取每行第4個字符以后的數據
cut cut1.txt -c 4-
運行效果
提取每行第3個字符前面所有字符
cut cut1.txt -c -3
運行效果
示例:切割提取指定字節數據
提取字符串"abc傳智播客" 前3個字節
echo "abc傳智播客" | cut -b -3
運行效果
提取字符串"abc傳智播客" 前4個字節
echo "abc傳智播客" | cut -b -4
運行效果
提取字符串"abc傳智播客" 前6個字節
echo "abc傳智播客" | cut -b -6
# 由于linux系統默認utf-8碼表, 所以一個漢字占3個字節
運行效果
提取字符串"abc傳智播客" 前4個字節, 就可以將漢字 "傳"輸出,
echo "abc傳智播客" | cut -nb -4
# -n 取消多字節字符分割直接輸出
運行效果
示例:切割提取指定單詞數據
在cut1.txt文件中切割出"AA"
cat cut1.txt | grep itheima | cut -d " " -f 1
示例:切割提取bash進程的PID號
命令
ps -aux | grep 'bash' | head -n 1 | cut -d " " -f 8
運行效果
示例:切割提取IP地址
ifconfig | grep broadcast | cut -d " " -f 10
解決ifconfig
yum search idconfig
yum install net-tools.x86_64
ifconfig
運行效果
小結
cut的作用
一個強大文本處理工具,它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本,然后按列劃分字段并進行提取、輸出等操作。
cut切割提取列
cut 文件或數據 -d 分隔符切割 -f 提取第X列
cut切割提取字符
cut 文件或數據 -c 提取字符范圍
cut切割提取字節
cut 文件或數據 -nb 提取直接范圍
Shell好用的工具:sed
目標
使用sed編輯文件替換文件中的單詞
編寫在文件中插入或修改行的sed程序
使用sed作為過濾器來過濾管道數據命令
介紹
sed (stream editor, 流編輯器) 是Linux下一款功能強大的非交互流式文本編輯器(vim是交互式文本編輯器),可以對文本文件的每一行數據匹配查詢之后進行增、刪、改、查等操作,支持按行、按字段、按正則匹配文本內容,靈活方便,特別適合于大文件的編輯.
sed是一種流編輯器,它一次處理一行內容, 將這行放入緩存(存區空間稱為:模式空間),然后才對這行進行處理,處理完后,將緩存區的內容發送到終端。
sed處理數據原理
語法
sed [選項參數] [模式匹配/sed程序命令] [文件名]
?
# 模式匹配,sed會讀取每一行數據到模式空間中, 之后判斷當前行是否符合模式匹配要求,符合要求就會
# ? ? 執行sed程序命令, 否則不會執行sed程序命令;如果不寫匹配模式,那么每一行都會執行sex程序命令
選項參數說明
選項參數 | 功能 |
---|---|
-e | 直接在指令列模式上進行sed的動作編輯。它告訴sed將下一個參數解釋為一個sed指令,只有當命令行上給出多個sed指令時才需要使用-e選項;一行命令語句可以執行多條sed命令 |
-i | 直接對內容進行修改,不加-i時默認只是預覽,不會對文件做實際修改 |
-f | 后跟保存了sed指令的文件 |
-n | 取消默認輸出,sed默認會輸出所有文本內容,使用-n參數后只顯示處理過的行 |
-r ruguler | 使用擴展正則表達式,默認情況sed只識別基本正則表達式 * |
sed程序命令功能描述
命令 | 功能描述 |
---|---|
a | add新增,a的后面可以接字串,在下一行出現 |
c | change更改, 更改匹配行的內容 |
d | delete刪除, 刪除匹配的內容 |
i | insert插入, 向匹配行前插入內容 |
p | print打印, 打印出匹配的內容,通常與-n選項和用 |
s | substitute替換, 替換掉匹配的內容 |
= | 用來打印被匹配的行的行號 |
n | 讀取下一行,遇到n時會自動跳入下一行 |
特殊符號
命令 | 功能描述 |
---|---|
! | 就像一個sed命令,放在限制條件后面, 對指定行以外的所有行應用命令(取反) |
{sed命令1;sed命令2} | 多個命令操作同一個的行 |
數據準備
sed.txt文件內容
ABC
itxinzhi itxinzhi
itcast
123
itxinzhi
示例:向文件中添加數據
演示1: 指定行號的前或后面添加數據
向第三行后面添加hello
sed '3ahello' sed.txt
3 , 代表第三行
a, 代表在后面添加, 出現在下一行
注意這里沒有修改源文件
運行效果
向第三行前面添加hello
sed '3ihello' sed.txt
3 , 代表第三行
i, 代表在前面添加, 出現在上一行
注意這里沒有修改源文件
運行效果
演示2: 指定內容前或后面添加數據
向內容 itxinzhi后面添加
hello,如果文件中有多行包括 ``itxinzhi
`,則每一行后面都會添加
sed '/itxinzhi/ahello' sed.txt
運行效果
向內容 itxinzhi 前面添加
hello,如果文件中有多行包括 ``itxinzhi
`,則每一行前面都會添加
sed '/itxinzhi/ihello' sed.txt
運行效果
演示3: 在最后一行前或后添加hello
在最后一行后面添加hello
sed '$ahello' sed.txt
$a: 最后一行后面添加
運行效果
在最后一行前面添加hello
sed '$ihello' sed.txt
$i: 最后一行前面添加
運行效果
示例: 刪除文件中的數據
演示1: 刪除第2行
命令
sed ?'2d' sed.txt
# d 用于刪除
# 2d 刪除第2行
運行效果
命令: 刪除第1行,第4行數據
sed '1d;4d' sed.txt
運行效果
演示2: 刪除奇數行
從第一行開始刪除,每隔2行就刪掉一行
sed '1~2d' sed.txt
# 1~2 從第1行開始, 每隔2行
運行效果
演示3: 刪除指定范圍的多行數據
刪除從第1行到第3行的數據
sed '1,3d' sed.txt
# 1,3 從指定第1行開始到第3行結束
運行效果
演示3: 刪除指定范圍取反的多行數據
刪除從第1行到第3行取反的數據
sed '1,3!d' sed.txt
# 1,3! 從指定第1行開始到第3行結束取反, 就是不在這個范圍的行
運行效果
演示4: 刪除最后一行
命令
sed ?'$d' ? sed.txt
運行效果
演示5: 刪除匹配itheima的行
命令
sed '/itheima/d' sed.txt
運行效果
演示6: 刪除匹配行到最后一行
刪除匹配itxinzhi行到最后一行 , 命令
sed '/itxinzhi/,$d' sed.txt
# , 代表范圍匹配
運行效果
演示7: 刪除匹配行及其后面一行
刪除匹配itxinzhi行及其后面一行
sed '/itxinzhi/,+1d' sed.txt
運行效果
演示9: 刪除不匹配的行
刪除不匹配 itxinzhi或
itcast` 的行
sed '/itxinzhi\|itcast/!d' sed.txt
?
# \| 是正則表達式的或者 這里|需要轉義, 所以為\|
# ! 取反
運行效果
示例:更改文件中的數據
演示1:將文件的第一行修改為hello
命令
sed ?'1chello' ?sed.txt
運行效果
演示2: 將包含itxinzhi的行修改為hello
命令
sed ?'/itxinzhi/chello' sed.txt
運行效果
演示3: 將最后一行修改為hello
命令
sed '$chello' sed.txt
運行效果
演示4: 將文件中的itxinzhi替換為hello
將文件中的itxinzhi替換為hello,默認只替換每行第一個itheima
sed 's/itxinzhi/hello/' ?sed.txt
運行效果
注意
's/itxinzhi/hello/'
最后一個/
不可少
將文本中所有的itxinzhi都替換為hello, 全局替換
sed 's/itxinzhi/hello/g' ?sed.txt
# g 代表匹配全局所有符合的字符
演示5: 替換后的內容寫入文件
將每行中第二個匹配的itxinzhi替換為hello , 將替換后的內容寫入到sed2.txt文件中
# 第一種方式
sed -n 's/itxinzhi/hello/2pw sed2.txt' sed.txt
# w寫入
# p打印, -n只是獲取
?
# 第二種方式
sed -n 's/itxinzhi/hello/2p ' sed.txt > sed2.txt
運行效果
演示6: 正則表達式匹配替換
匹配有 i
的行,替換匹配行中 t
后的所有內容為空
sed '/i/s/t.*//g' sed.txt
# /t.*/ 表示逗號后的所又內容
運行效果
演示7: 每行末尾拼接test
sed 's/$/& test/' sed.txt
# & 用于拼接
運行效果
演示8: 每行行首添加注釋 #
命令
sed 's/^/#/' sed.txt
運行效果
示例: 查詢文件或管道中的數據
需求1: 查詢含有 itcast
的行數據
命令
sed -n '/itcast/p' sed.txt
運行效果
需求2: 管道過濾查詢
管道查詢所有進程中含有sshd的進程信息命令
ps -aux | sed -n '/sshd/p'
運行效果
示例: 多個sed程序命令執行
將sed.txt文件中的第1行刪除并將 itxinzhi
替換為 itcast
# 第一種方式, 多個sed程序命令 在每個命令之前使用 -e 參數
sed -e '1d' -e 's/itxinzhi/itcast/g' sed.txt
?
# 第二種方式
sed ?'1d;s/itxinzhi/itcast/g' sed.txt
運行效果
sed高級用法: 緩存區數據交換
模式空間與暫存空間介紹
-
首先需要明白, sed處理文件是逐行處理的, 即讀取一行處理一行,輸出一行;
-
sed把文件讀出來每一行存放的空間叫模式空間, 會在該空間中對讀到的內容做相應處理;
-
此外sed還有一個額外的空間即暫存空間, 暫存空間剛開始里邊只有個空行, 記住這一點;
-
sed可使用相應的命令從模式空間往暫存空間放入內容或從暫存空間取內容放入模式空間;
2個緩存空間傳輸數據的目的是為了更好的處理數據, 一會參考案例學習
關于緩存區sed程度命令
命令 | 含義 |
---|---|
h | 將模式空間里面的內容復制到暫存空間緩存區(覆蓋方式) |
H | 將模式空間里面的內容復制到暫存空間緩存區(追加方式) |
g | 將暫存空間里面的內容復制到模式空間緩存區(覆蓋方式) |
G | 將暫存空間里面的內容復制到模式空間緩存區(追加方式) |
x | 交換2個空間的內容 |
示例: 緩存空間數據交換
演示1: 第一行粘貼到最后1行
將模式空間第一行復制到暫存空間(覆蓋方式),并將暫存空間的內容復制到模式空間中的最后一行(追加方式)
sed '1h;$G' sed.txt
# 1h 從模式空間中將第一行數據復制到暫存空間(覆蓋方式)
# $G 將暫存空間中的內容復制到模式空間中最后一行(追加方式)
運行效果
演示2: 第一行刪除后粘貼到最后1行
將模式空間第一行復制到暫存空間(覆蓋方式)并刪除, 最后將暫存空間的內容復制到模式空間中的最后一行(追加方式)
sed '1{h;d};$G' sed.txt
# 1{h;d}對模式空間中的第一行數據同時進行復制到暫存空間(覆蓋方式)和刪除模式空間中的第一行數據
運行效果
演示3: 第一行數據復制粘貼替換其他行數據
將模式空間第一行復制到暫存空間(覆蓋方式), 最后將暫存空間的內容復制到模式空間中替換從第2行開始到最后一行的每一行數據(覆蓋方式)
sed '1h;2,$g' sed.txt
運行命令
演示4: 將前3行數據數據復制粘貼到最后一行
將前3行數據復制到暫存空間(追加方式), 之后將暫存空間的所有內容復制粘貼到模式空間最后一行(追加方式)
sed '1,3H;$G' sed.txt
運行效果
示例: 給每一行添加空行
插入空行
sed G -i sed.txt
# G 每行后面添加一個空行
# -i 修改源文件
運行效果
示例: 刪除所有的空行
命令
sed -i '/^$/d' sed.txt
運行效果
Shell好用的工具:awk
介紹
awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理, 因為切開的部分使用awk可以定義變量,運算符, 使用流程控制語句進行深度加工與分析。
創始人 Alfred V. Aho、Peter J. Weinberger和Brian W. Kernighan awk由來是姓氏的首字母
語法
awk [options] 'pattern{action}' {filenames}
pattern:表示AWK在數據中查找的內容,就是匹配模式
action:在找到匹配內容時所執行的一系列命令
選項參數說明
選項參數 | 功能 |
---|---|
-F | 指定輸入文件拆分分隔符 |
-v | 賦值一個用戶定義變量 |
awk內置變量
內置變量 | 含義 |
---|---|
ARGC | 命令行參數個數 |
ARGV | 命令行參數排列 |
ENVIRON | 支持隊列中系統環境變量的使用 |
FILENAME | awk瀏覽的文件名 |
FNR | 瀏覽文件的記錄數 |
FS | 設置輸入域分隔符,等價于命令行 -F選項 |
NF | 瀏覽記錄的域的個數, 根據分隔符分割后的列數 |
NR | 已讀的記錄數, 也是行號 |
OFS | 輸出域分隔符 |
ORS | 輸出記錄分隔符 |
RS | 控制記錄分隔符 |
$n | $0 變量是指整條記錄。$1 表示當前行的第一個域,$2 表示當前行的第二個域,......以此類推。 |
$NF | $NF是number finally,表示最后一列的信息,跟變量NF是有區別的,變量NF統計的是每行列的總數 |
數據準備
cp /etc/passwd ./
示例 : 默認每行空格切割數據
命令
echo "abc 123 456" | awk '{print $1"&"$2"&"$3}'
運行效果
示例: 打印含有匹配信息的行
搜索passwd文件有root關鍵字的所有行
awk '/root/' passwd
# '/root/' 是查找匹配模式, 沒有action命令, 默認輸出所有符合的行數據
運行效果
示例: 打印匹配行中第7列數據
搜索passwd文件有root關鍵字的所有行, 然后以":"拆分并打印輸出第7列
awk -F: '/root/{print $7}' passwd
# -F: 以':'分隔符拆分每一個列(域)數據
運行效果
示例: 打印文件每行屬性信息
統計passwd: 文件名,每行的行號,每行的列數,對應的完整行內容:
awk -F ':' '{print "文件名:" FILENAME ",行號:" NR ",列數:" NF ",內容:" $0}' passwd
# "文件名:" 用于拼接字符串
運行效果
使用printf替代print,可以讓代碼閱讀型更好
awk -F ':' '{printf("文件名:%5s,行號:%2s, 列數:%1s, 內容:%2s\n",FILENAME,NR,NF,$O)}' passwd
# printf(格式字符串,變量1,變量2,...)
# 格式字符串: %ns 輸出字符串,n 是數字,指代輸出幾個字符, n不指定自動占長度
# 格式字符串: %ni 輸出整數,n 是數字,指代輸出幾個數字
# 格式字符串: %m.nf 輸出浮點數,m 和 n 是數字,指代輸出的整數位數和小數位數。如 %8.2f 代表共輸出 8 位數,其中 2 位是小數,6 位是整數;
運行效果
示例: 打印第二行信息
打印/etc/passwd/的第二行信息
awk -F ':' 'NR==2{printf("filename:%s,%s\n",FILENAME,$0)}' passwd
運行效果
示例: 查找以c開頭的資源
awk過濾的使用, 查找當前目錄下文件名以c開頭的文件列表
ls -a | awk '/^c/'
運行效果
示例: 打印第一列
按照":" 分割查詢第一列打印輸出
awk -F ':' '{print $1}' passwd
運行效果
示例: 打印最后1列
按照":" 分割查詢最后一列打印輸出
awk -F: '{print $NF}' passwd
運行效果
示例: 打印倒數第二列
按照":" 分割查詢倒數第二列打印輸出
awk -F: '{print $(NF-1)}' passwd# $(NF-N) N是幾, 就是倒數第幾列
運行效果
示例: 打印10到20行的第一列
獲取第10到20行的第一列的信息
awk -F: '{if(NR>=10 && NR<=20) print $1}' passwd
運行效果
示例: 多分隔符使用
"one:two/three"字符串按照多個分隔符":"或者"/" 分割, 并打印分割后每個列數據
echo "one:two/three" | awk -F '[:/]' '{printf("%s\n%s\n%s\n%s\n",$0,$1,$2,$3)}'
運行效果
示例: 添加開始與結束內容
給數據添加開始與結束
echo -e ?"abc\nabc" | awk 'BEGIN{print "開始..."} {print $0} END{print "結束..."}'
?
# BEGIN 在所有數據讀取行之前執行;END 在所有數據執行之后執行。
運行效果
示例 : 使用循環拼接分割后的字符串
"abc itxinzhi itcast 21" 使用空格分割后, 通過循環拼接在一起
echo "abc itxinzhi ? ? itcast ? 21" | awk -v str="" -F '[ ]+' '{for(n=1;n<=NF;n++){ str=str$n} print str }'# -v 定義變量
運行效果
示例: 操作指定數字運算
將passwd文件中的用戶id增加數值1并輸出
echo "2.1" | awk -v i=1 '{print $0+i}'
運行效果
示例: 切割ip
切割IP
ifconfig | awk '/broadcast/{print}' | awk -F " " '{print $2}'
運行效果
示例: 顯示空行行號
查詢sed.txt中空行所在的行號
sed 'G' sed.txt | awk '/^$/{print NR}'
運行效果
小結
grep , sed ,awk , cut 文本字符串操作四劍客的區別
grep:用于查找匹配的行
cut: 截取數據. 截取某個文件中的列, 重點是按照列分割, 這個命令不適合截取文件中有多個空白字符的字段
sed: 增刪改查數據. sed用于在文件中以行來截取數據進行增\刪\改\查
awk:截取分析數據. 可以在某個文件中是以豎列來截取分析數據, 如果字段之間含有很多空白字符也可以獲取需要的數據, awk是一種語言,可以深入分析文件數據
Shell好用的工具:sort
目標
能夠使用sort對字符串升序或降序排序
能夠使用sort 對數字升序或降序
能夠使用sort 對多列進行排序
介紹
sort命令是在Linux里非常有用,它將文件進行排序,并將排序結果標準輸出或重定向輸出到指定文件。
語法
sort (options) 參數
選項 | 說明 |
---|---|
==-n== | number,依照數值的大小排序 |
==-r== | reverse, 以相反的順序來排序 |
==-t 分隔字符== | 設置排序時所用的分隔字符, 默認空格是分隔符 |
==-k== | 指定需要排序的列 |
-d | 排序時,處理英文字母、數字及空格字符外,忽略其他的字符。 |
-f | 排序時,將小寫字母視為大寫字母 |
-b | 忽略每行前面開始出的空格字符 |
==-o 輸出文件== | 將排序后的結果存入指定的文件 |
-u | 意味著是唯一的(unique),輸出的結果是去完重了的 |
-m | 將幾個排序好的文件進行合并 |
參數:指定待排序的文件列表
數據準備
sort.txt文本文件代碼
張三 30 ?
李四 95 ?
播仔 85
播仔 85
播仔 86
AA 85
播妞 100
示例1: 數字升序
按照“ ”空格分割后的第2列數字升序排序。
sort -t " " -k2n,2 sort.txt
# -t " " 代表使用空格分隔符拆分列
# -k 2n,2 代表根據從第2列開始到第2列結束進行數字升序, 僅對第2列排序
運行效果
示例2: 數字升序去重
先按照“ ”空格分割后的, 然后,按照第2列數字升序排序, 最后對所有列去重
sort -t " " -k2n,2 -uk1,2 sort.txt
運行效果
注意: 先排序再去重
示例3: 數字升序去重結果保存到文件
命令
sort -t " " -k2n,2 -uk1,2 -o sort2.txt sort.txt
運行效果
示例4: 數字降序去重
先按照“ ”空格分割后的, 然后,按照第2列數字降序排序, 最后對所有列去重
sort -t " " -k2nr,2 -uk1,2 sort.txt
運行效果
示例5: 多列排序
數據準備sort3.txt
公司A,部門A,3
公司A,部門B,0
公司A,部門C,10
公司A,部門D,9
公司B,部門A,30
公司B,部門B,40
公司B,部門C,43
公司B,部門D,1
公司C,部門A,30
公司C,部門B,9
公司C,部門C,100
公司C,部門D,80
公司C,部門E,60
要求: 以","分割先對第一列字符串升序, 再對第3列數字降序
sort -t "," -k1,1 -k3nr,3 sort3.txt
運行效果
小結
能夠使用sort對字符串升序或降序排序
字符串升序:
sort -kstart,end 文件
字符串降序:
sort -kstartr,end 文件
能夠使用sort 對數字升序或降序
數字升序:
sort -kstartn,end 文件
數字降序:
sort -kstartnr,end 文件
能夠使用sort 對多列進行排序
sort -kstart[nr],end -kstart[nr],end ... 文件
面試題:查空行
問題:使用Linux命令查詢file.txt中空行所在的行號
file1.txt數據準備
itxinzhi itxinzhi
?
itcast
123
?
itxinzhi
答案:
awk '/^$/{print NR}' file1.txt
運行效果
面試題:求一列的和
問題:有文件file2.txt內容如下:
張三 40
李四 50
王五 60
使用Linux命令計算第二列的和并輸出
awk '{sum+=$2} END{print "求和: "sum}' file2.txt
運行效果
面試題:檢查文件是否存在
問題:Shell腳本里如何檢查一個文件是否存在?如果不存在該如何處理?
答:
if [ -e /root/file1.txt ]; then ?echo "文件存在"; else echo "文件不存在"; fi
運行效果
面試題:數字排序
問題:用shell寫一個腳本,對文本中無序的一列數字排序
cat file3.txt文件內容
9
8
7
6
5
4
3
2
10
1
答
sort -n file3.txt | awk '{sum+=$1; print $1} END{print "求和: "sum}'
運行效果
面試題:搜索指定目錄下文件內容
問題:請用shell腳本寫出查找當前文件夾(/root)下所有的文本文件內容中包含有字符”123”的文件名稱?
答:
grep -r "123" /root | cut -d ":" -f 1| sort -u
運行效果
面試題:批量生成文件名
問題: 批量生產指定數目的文件,文件名采用"納秒"命名
答: file4.sh
#!/bin/bash
read -t 30 -p "請輸入創建文件的數目:" n
test=$(echo $n | sed 's/[0-9]//g') #檢測非數字輸入
if [ -n "$n" -a -z "$test" ] #檢測空輸入
thenfor ((i=0;i<$n;i=i+1 ))doname=$(date +%N)[ ! -d ./temp ] && ?mkdir -p ./temptouch "./temp/$name"echo "創建 $name 成功!"doneelseecho "創建失敗"exit 1
fi
運行效果
面試題:批量改名
問題: 將/root/temp目錄下所有文件名重命名為"舊文件名-遞增數字"?
重命名命令
rename 舊文件名 新文件名 舊文件所在位置
腳本代碼file5.sh
#!/bin/bash
filenames=$(ls /root/temp)
number=1
for name in $filenames
doprintf "命令前:%s" ${name}newname=${name}"-"${number}rename $name ${newname} /root/temp/*let number++ #每個改名后的文件名后綴數字加1printf "重命名后:%s \n" ${newname}
done
運行效果
面試題:批量創建用戶
問題: 根據users.txt中提供的用戶列表,一個名一行, 批量添加用戶到linux系統中
已知users.txt數據準備
user1
user2
知識點分析1: 添加用戶命令
useradd 用戶名
知識點分析2: 設置每個用戶密碼默認密碼
echo "123456" | passwd --stdin 用戶名
運行效果
面試題答案: 腳本代碼file6.sh
#!/bin/bash
ULIST=$(cat /root/users.txt) ?##/root/users.txt? 里面存放的是用戶名,一個名一行
for UNAME in $ULIST
douseradd $UNAMEecho "123456" | passwd --stdin $UNAME &>/dev/null[ $? -eq 0 ] && echo "$UNAME用戶名與密碼添加初始化成功!"
done
運行效果
面試題:篩選單詞
問題: 根據給出的數據輸出里面單詞長度大于3的單詞
數據準備
I may not be able to change the past, but I can learn from it.
shell腳本file7.sh
echo "I may not be able to change the past, but I can learn from it." | awk -F "[ ,.]" '{for(i=1;i<NF;i++){ if(length($i)>3){print $i}}}'
運行效果
面試題:單詞及字母去重排序
問題
1、按單詞出現頻率降序排序!
2、按字母出現頻率降序排序!
file8.txt 文件內容
No. The Bible says Jesus had compassion2 on them for He saw them as sheep without a shepherd. They were like lost sheep, lost in their sin. How the Lord Jesus loved them! He knew they were helpless and needed a shepherd. And the Good Shepherd knew He had come to help them. But not just the people way back then. For the Lord Jesus knows all about you, and loves you too, and wants to help you.
按照單詞出現頻率降序
awk -F "[,. ]+" '{for(i=1;i<=NF;i++)S[$i]++}END{for(key in S)print S[key],key}' file8.txt |sort -rn|head
運行效果
按照字符出現頻率降序前10個
awk -F "" '{for(i=1;i<=NF;i++)S[$i]++}END{for(key in S)print S[key],key}' file8.txt |sort -rn|head
運行效果
面試題:MySQL分庫備份
#!/bin/sh
user=root ? ? ?#用戶名
pass=root ? ? ?#密碼
backfile=/root/mysql/backup #備份路徑
[ ! -d $backfile ] && mkdir -p $backfile #判斷是否有備份路徑
cmd="mysql -u$user -p$pass" ?#登錄數據庫
dump="mysqldump -u$user -p$pass " #mysqldump備份參數
dblist=`$cmd -e "show databases;" 2>/dev/null |sed 1d|egrep -v "_schema|mysql"` #獲取庫名列表
echo "需要備份的數據列表:"
echo $dblist
echo "開始備份:"
for db_name in $dblist #for循環備份庫列表
doprintf '正在備份數據庫:%s' ${db_name}$dump $db_name 2>/dev/null |gzip >${backfile}/${db_name}_$(date +%m%d).sql.gz #庫名+時間備份打包至指定路徑下printf ',備份完成\n'
done
echo "全部備份完成!!!"
面試題:MySQL數據庫分庫分表備份
#!/bin/sh
user=root ? ? ?#用戶名
pass=root ? ? ?#密碼
backfile=/root/mysql/backup #備份路徑
[ ! -d $backfile ] && mkdir -p $backfile #判斷是否有備份路徑
cmd="mysql -u$user -p$pass" ?#登錄數據庫
dump="mysqldump -u$user -p$pass " #mysqldump備份參數
dblist=`$cmd -e "show databases;" 2>/dev/null |sed 1d|egrep -v "_schema|mysql"` #獲取庫名列表
echo "需要備份的數據列表:"
echo $dblist
echo "開始備份:"
for db_name in $dblist #for循環備份庫列表
doprintf '正在備份數據庫:%s\n' ${db_name}tables=`mysql -u$user -p"$pass" -e "use $db_name;show tables;" 2>/dev/null|sed 1d`for j in $tablesdoprintf '正在備份數據庫 %s 表 %s ' ${db_name} ${j}$dump -B --databases $db_name --tables $j 2>/dev/null > ${backfile}/${db_name}-${j}-`date +%m%d`.sqlprintf ',備份完成\n'done
?
?printf '數據庫 %s 備份完成\n' ${db_name}
done
echo "全部備份完成!!!"