shell腳本可以讓降低大家的工作強度,提升大家的管理能力和薪資報酬,還可以讓大家有時間學習提升自己,更能讓你有時間喝茶撩妹子。是以,學好shell那就是非常必要的啦,那麼在學習shell之前我們得熱熱身,做一下準備工作了。
學習之前首先要弄清什麼是shell腳本:
shell腳本本質上就是要将完成一件事情的所有指令按照執行的先後順序寫入一個檔案,并給予檔案執行權限
複制
so!想學好shell腳本首先要考核一下自己的linux指令學的是否紮實,接下來為了能讓大家學習shell更加順暢,我把常用的一些資料處理的指令給大家回顧一下。
我們重點回顧以下幾類指令
資料檢索指令
行檢索:grep egrep
字元串檢索:cut tr
資料處理指令
資料排序:sort
資料去重: uniq
文本資料合并: paste
資料輸出: tee
資料處理: xargs
複制
一、 資料處理指令
1、grep: 負責從資料源中檢索對應的字元串,行過濾。
grep用于根據關鍵字進行行過濾
grep options 'keys' filename
OPTIONS:
-i: 不區分大小寫
-v: 查找不包含指定内容的行,反向選擇
-w: 按單詞搜尋
-n: 顯示行号
-A: 顯示比對行及後面多少行 -A 5
-B: 顯示比對行及前面多少行
-o: 列印比對關鍵字
-c: 統計比對到的次數
-r: 逐層周遊目錄查找
-C: 顯示比對行前後多少行
-l:隻列出比對的檔案名
-L:列出不比對的檔案名
-e: 使用正則比對
-E:使用擴充正則比對
^key:以關鍵字開頭
key$:以關鍵字結尾
^$:比對空行
--color=auto :可以将找到的關鍵詞部分加上顔色的顯示
常用指令選項必知必會 示例:
# grep -i root passwd 忽略大小寫比對包含root的行
# grep -w ftp passwd 精确比對ftp單詞
# grep -wo ftp passwd 列印比對到的關鍵字ftp
# grep -n root passwd 列印比對到root關鍵字的行好
# grep -ni root passwd 忽略大小寫比對統計包含關鍵字root的行
# grep -nic root passwd 忽略大小寫比對統計包含關鍵字root的行數
# grep -i ^root passwd 忽略大小寫比對以root開頭的行
# grep bash$ passwd 比對以bash結尾的行
# grep -n ^$ passwd 比對空行并列印行号
# grep ^# /etc/vsftpd/vsftpd.conf 比對以#号開頭的行
# grep -v ^# /etc/vsftpd/vsftpd.conf 比對不以#号開頭的行
# grep -A 5 mail passwd 比對包含mail關鍵字及其後5行
# grep -B 5 mail passwd 比對包含mail關鍵字及其前5行
# grep -C 5 mail passwd 比對包含mail關鍵字及其前後5行
centos8中已經為大家設定了,存放在/etc/profile.d/colorgrep.sh檔案中,如若大家使用的系統中沒有設定顔色輸出,
可以使用以下方法來自行設定
臨時設定:
# alias grep='grep --color=auto' //隻針對目前終端和目前使用者生效
永久設定:
1)全局(針對所有使用者生效)
vim /etc/bashrc
alias grep='grep --color=auto'
source /etc/bashrc
2)局部(針對具體的某個使用者)
vim ~/.bashrc
alias grep='grep --color=auto'
注意:如果希望你對環境變量的設定立刻生效,可以使用以下指令而不需要重新開機計算機
source ~/.bashrc
複制
2、cut資料截取
cut用于列截取
-c: 以字元為機關進行分割。
-d: 自定義分隔符,預設為制表符。\t
-f: 與-d一起使用,指定顯示哪個區域。
# cut -d: -f1 1.txt 以:冒号分割,截取第1列内容
# cut -d: -f1,6,7 1.txt 以:冒号分割,截取第1,6,7列内容
# cut -c4 1.txt 截取檔案中每行第4個字元
# cut -c1-4 1.txt 截取檔案中每行的1-4個字元
# cut -c4-10 1.txt
# cut -c5- 1.txt 從第5個字元開始截取後面所有字元
複制
3、tr 字元轉換:替換,删除
tr用來從标準輸入中通過替換或删除操作進行字元轉換;主要用于删除檔案中控制字元或進行字元轉換。
使用tr時要轉換兩個字元串:字元串1用于查詢,字元串2用于處理各種轉換。
文法:
commands|tr 'string1' 'string2'
tr 'string1' 'string2' < filename
tr options 'string1' < filename
-d 删除字元串1中所有輸入字元。
-s 删除所有重複出現字元序列,隻保留第一個;即将重複出現字元串壓縮為一個字元串。
a-z 任意小寫
A-Z 任意大寫
0-9 任意數字
[root@zutuanxue shell01]# cat 3.txt 自己建立該檔案用于測試
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
boss02:x:516:511::/home/boss02:/bin/bash
vip:x:517:517::/home/vip:/bin/bash
stu1:x:518:518::/home/stu1:/bin/bash
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
aaaaaaaaaaaaaaaaaaaa
bbbbbb111111122222222222233333333cccccccc
hello world 888
666
777
999
# tr -d '[:/]' < 3.txt 删除檔案中的:和/
# cat 3.txt |tr -d '[:/]' 删除檔案中的:和/
# tr '[0-9]' '@' < 3.txt 将檔案中的數字替換為@符号
# tr '[a-z]' '[A-Z]' < 3.txt 将檔案中的小寫字母替換成大寫字母
# tr -s '[a-z]' < 3.txt 比對小寫字母并将重複的壓縮為一個
# tr -s '[a-z0-9]' < 3.txt 比對小寫字母和數字并将重複的壓縮為一個
複制
4、sort排序
sort:将檔案的每一行作為一個機關,從首字元向後,依次按ASCII碼值進行比較,最後将他們按升序輸出。
文法:
sort [options] [filename]
-u :去除重複行
-r :降序排列,預設是升序
-o : 将排序結果輸出到檔案中 類似 重定向符号 >
-n :以數字排序,預設是按字元排序
-t :分隔符
-k :第N列
-b :忽略前導空格。
-R :随機排序,每次運作的結果均不同。
示例:
# sort -n -t: -k3 1.txt 按照使用者的uid進行升序排列
# sort -nr -t: -k3 1.txt 按照使用者的uid進行降序排列
# sort -n 2.txt 按照數字排序
# sort -nu 2.txt 按照數字排序并且去重
# sort -nr 2.txt
# sort -nru 2.txt
# sort -nru 2.txt
# sort -n 2.txt -o 3.txt 按照數字排序并将結果重定向到檔案
# sort -R 2.txt
# sort -u 2.txt
複制
5、uniq 去除連續的重複行
應用技巧:去重前先使用sort排序
uniq:去除連續重複行
文法:
uniq [options] [filename]
-i: 忽略大小寫
-c: 統計重複行次數
-d:隻顯示重複行
# uniq 2.txt
# uniq -d 2.txt
# uniq -dc 2.txt
複制
6、tee 雙向輸出
tee工具從标準輸入讀取并寫入标準輸出和檔案,即:雙向覆寫重定向<螢幕輸出|文本輸入>
somecommand |tee filename
-a 雙向追加重定向
# echo hello world
# echo hello world|tee file1
# cat file1
# echo 999|tee -a file1
# cat file1
複制
7、paste
paste工具用于合并檔案行輸出到螢幕,不會改動源檔案
-d:自定義間隔符,預設是tab,隻接受一個字元
-s:将每個檔案中的所有内容按照一行輸出,檔案中的行與行以TAB間隔。
[root@zutuanxue shell01]# cat a.txt
hello
[root@zutuanxue shell01]# cat b.txt
hello world
888
999
[root@zutuanxue shell01]# paste a.txt b.txt
hello hello world
888
999
[root@zutuanxue shell01]# paste b.txt a.txt
hello world hello
888
999
[root@zutuanxue shell01]# paste -d'@' b.txt a.txt
hello world@hello
888@
999@
[root@zutuanxue shell01]# paste -s b.txt a.txt
hello world 888 999
hello
複制
8、xargs 上一個指令的輸出作為下一個指令的指令行參數
管道(|):上一個指令的輸出作為下一個指令的輸入,做的是資料源。
[root@manage01 ~]# sort -n 2.txt |uniq
1
2
3
5
6
10
99
9999
如何将上一個指令的輸出,作為下一個指令的參數呢?
xargs 上一個指令的輸出作為下一個指令的指令行參數
回顧:
linux 指令格式
指令 指令選項 參數
ls -l /
========================
xargs 可以将管道或标準輸入(stdin)資料轉換成指令行參數,也能夠從檔案的輸出中讀取資料。
xargs 一般是和管道一起使用。
指令格式:
''[somecommand]|[filename]'' |xargs -item command
OPTIONS:
-a file 從檔案中讀入作為sdtin
-E flag flag必須是一個以空格分隔的标志,當xargs分析到含有flag這個标志的時候就停止。
-p 當每次執行一個argument的時候詢問一次使用者。
-n num 後面加次數,表示指令在執行的時候一次用的argument的個數,預設是用所有的。
-t 表示先列印指令,然後再執行。
-i 或者是-I,這得看linux支援了,将xargs的每項名稱,一般是一行一行指派給 {},可以用 {} 代替。
-r no-run-if-empty 當xargs的輸入為空的時候則停止xargs,不用再去執行了。
-d delim 分隔符,預設的xargs分隔符是回車,argument的分隔符是空格,這裡修改的是xargs的分隔符。
注意:linux指令格式一般為
指令 指令選項 參數
上一個指令的輸出就是下一個指令的參數 這句話結合指令文法 應該知道輸出的内容在下一個指令的位置了吧。
案例
[root@zutuanxue ~]# find / -name zutuanxue |xargs gzip
[root@zutuanxue ~]# cat 1
1
2
3
4
5
6
7
8
9
10
[root@zutuanxue ~]# xargs -a 1
1 2 3 4 5 6 7 8 9 10
[root@zutuanxue ~]# xargs -a 1 -E 5
1 2 3 4
這樣就明白使用xargs -a 為什麼讀取檔案的時候會把檔案中的所有内容都輸出了吧
[root@zutuanxue ~]# xargs -a 1 -p
echo 1 2 3 4 5 6 7 8 9 10 ?...y
1 2 3 4 5 6 7 8 9 10
[root@zutuanxue ~]# xargs -a 1 -p
echo 1 2 3 4 5 6 7 8 9 10 ?...n
同理為什麼把檔案中的所有行按一行輸出呢,原因就是預設輸出所有
[root@zutuanxue ~]# xargs -a 1 -n3
1 2 3
4 5 6
7 8 9
10
[root@zutuanxue ~]# xargs -a 1 -n3 -p
echo 1 2 3 ?...y
echo 4 5 6 ?...1 2 3
y
echo 7 8 9 ?...4 5 6
y
echo 10 ?...7 8 9
y
10
和-p指令選項一樣,顯示他是怎麼執行的,隻不過這個不需要确認。
[root@zutuanxue ~]# cat 1 |xargs -t
echo 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
為何讀入檔案會把所有行都放在一行呢?這個和xargs的列分割符有關系
預設是回車
我們可以使用-d 改掉預設列與列的預設分割符為其他,自然就會換行了
[root@zutuanxue ~]# xargs -a 1 -d "@"
1
2
3
4
5
6
7
8
9
10
複制
9、shell字元
有基礎的同學不要和正規表達式中的符号含義搞混淆了。
!: 執行曆史指令 !! 執行上一條指令
$: 變量中取内容符
+ - * / %: 對應數學運算 加 減 乘 除 取餘數
&: 背景執行
;: 分号可以在shell中一行執行多個指令,指令之間用分号分割
\: 轉義字元
``: 反引号 指令中執行指令 echo "today is `date +%F`"
' ': 單引号,腳本中字元串要用單引号引起來,但是不同于雙引号的是,單引号不解釋變量
" ": 雙引号,腳本中出現的字元串可以用雙引号引起來
通配符
~: 家目錄 # cd ~ 代表進入使用者家目錄
*: 星号是shell中的通配符 比對所有
?: 問号是shell中的通配符 比對除回車以外的一個字元
[list]: 比對[list]中的任意單個字元
[!list]: 比對除list中的任意單個字元
{string1,string2,...}: 比對string1,string2或更多字元串
重定向
> 覆寫輸入
>> 追加輸入
< 輸出
<< 追加輸出
管道指令
|: 管道符 上一個指令的輸出作為下一個指令的輸入 cat filename | grep "abc"
複制
10、組合指令實戰
job1: 檢索本機的IP、NETMASK、MAC位址、廣播位址
IP: 172.20.10.3
NetMask: 255.255.255.240
Broadcast: 172.20.10.15
MAC Address: 00:0c:29:8d:49:ea
job2: 将系統中所有普通使用者的使用者名、密碼和預設shell儲存到一個檔案中,要求使用者名密碼和預設shell之間用tab鍵分割
ayitula x /bin/bash
組合指令實戰代碼
job1: 檢索本機的IP、NETMASK、MAC位址、廣播位址
[root@zutuanxue ~]# ifconfig ens33 檢索網卡資訊
[root@zutuanxue ~]# ifconfig ens33|grep -w inet|tr -d '[a-zA-Z]'|tr -s " " 處理檢索行
IP位址
[root@zutuanxue ~]# ifconfig ens33|grep -w inet|tr -d [a-zA-Z]|tr -s " "|cut -d " " -f2|xargs echo "IP: "
IP: 172.20.10.3
NetMask位址
[root@zutuanxue ~]# ifconfig ens33|grep -w inet|tr -d [a-zA-Z]|tr -s " "|cut -d " " -f3|xargs echo "NetMask: "
NetMask: 255.255.255.240
廣播位址
[root@zutuanxue ~]# ifconfig ens33|grep -w inet|tr -d [a-zA-Z]|tr -s " "|cut -d " " -f4|xargs echo "Broadcast: "
Broadcast: 172.20.10.15
MAC位址
[root@zutuanxue ~]# ifconfig ens33|grep -w ether|tr -s " "|cut -d " " -f3|xargs echo "MAC Address: "
MAC Address: 00:0c:29:8d:49:ea
job2: 将系統中所有普通使用者的使用者名、密碼和預設shell儲存到一個檔案中,要求使用者名密碼和預設shell之間用tab鍵分割
[root@zutuanxue ~]# cut -d ":" -f1,2,7 /etc/passwd|tr ":" "\t"|grep -i "bash"|grep -v "root"
ayitula x /bin/bash
複制
二、學習視訊
視訊:資料檢索指令-grep
視訊:資料截取指令-cut&tr
視訊:資料排序指令-sort
視訊:資料去重指令-uniq
視訊:資料雙向輸出指令-tee
視訊:資料合并-paste指令
視訊:資料處理-xargs指令
視訊:shell符号介紹
視訊:shell資料處理實戰練習