1.文件管理之:字符處理命令(sort猖腕、uniq、cut恨闪、sed倘感、grep、awk咙咽、wc老玛、)
----------------------------------------sort排序----------------------------------------
在有些情況下,需要對(duì)應(yīng)一個(gè)無序的文本文件進(jìn)行數(shù)據(jù)的排序钧敞,這時(shí)就需要使用sort進(jìn)行排序了蜡豹。
sort [OPTION]... [FILE]...
# -r:倒序 -n:按數(shù)字排序 -t:指定分隔符(默認(rèn)空格) -k:指定第幾列, 指定幾列幾字符(指定1,1? 3.1,3.3)
#1.首先創(chuàng)建一個(gè)文件,寫入一寫無序的內(nèi)容
[root@xuliangwei ~]# cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF
#2.使用sort下面對(duì)輸出的內(nèi)容進(jìn)行排序
[root@xuliangwei ~]# sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11
#結(jié)果并不是按照數(shù)字排序溉苛,而是按字母排序余素。
#可以使用-t指定分隔符, 使用-k指定需要排序的列。
[root@xuliangwei ~]# sort -t ":" -k2 sort.txt
d:1
f:11 #第二行為什么是11炊昆?不應(yīng)該按照順序排列?
c:2
b:3
a:4
e:5
#按照排序的方式, 只會(huì)看到第一個(gè)字符,11的第一個(gè)字符是1, 按照字符來排序確實(shí)比2小威根。
#如果想要按照數(shù)字的方式進(jìn)行排序, 需要使用 -n參數(shù)凤巨。
[root@xuliangwei ~]# sort -t ":" -n -k2 p.txt
d:1
c:2
b:3
a:4
e:5
f:11
#測(cè)試案例,下載文件http://fj.xuliangwei.com/public/ip.txt洛搀,對(duì)該文件進(jìn)行排序
[root@xuliangwei ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt
----------------------------------------uniq去重----------------------------------------
如果文件中有多行完全相同的內(nèi)容敢茁,當(dāng)前是希望能刪除重復(fù)的行,同時(shí)還可以統(tǒng)計(jì)出完全相同的行出現(xiàn)的總次數(shù), 那么就可以使用uniq命令解決這個(gè)問題(但是必須配合sort使用)留美。
uniq [OPTION]... [INPUT [OUTPUT]]
#選項(xiàng):-c? 計(jì)算重復(fù)的行
#1.創(chuàng)建一個(gè)file.txt文件:
[root@xuliangwei ~]# cat >> file1.txt <<EOF
abc
123
abc
123
EOF
#2.uniq需要和sort一起使用, 先使用sort排序, 讓重復(fù)內(nèi)容連續(xù)在一起
[root@xuliangwei ~]# sort file.txt
123
123
abc
abc
#3.使用uniq去除相鄰重復(fù)的行
[root@xuliangwei ~]# cat file.txt |sort|uniq
123
abc
#4.-c參數(shù)能統(tǒng)計(jì)出文件中每行內(nèi)容重復(fù)的次數(shù)
[root@xuliangwei ~]# cat file.txt |sort|uniq -c
? ? ? 2 123
? ? ? 2 abc
請(qǐng)統(tǒng)計(jì)分析如下日志,統(tǒng)計(jì)訪問量最高的IP,打印前top10的IP.
[root@www ~]# awk '{print $1}' docs.xuliangwei.log |sort |uniq -c|sort -n|tail -5
? ? 101 139.226.172.91
? ? 159 139.226.173.216
? ? 347 139.226.173.12
? ? 446 123.207.173.97
? ? 495 114.92.159.100
----------------------------------------cut截取字段----------------------------------------
cut OPTION... [FILE]...
#選項(xiàng):-d 指定分隔符 -f 數(shù)字,取第幾列 –f3,6三列和6列? ? ? ? ? ? ? ? -c 按字符取(空格也算)
echo "Im xlw, is QQ 552408925" >file.txt? #過濾出文件里 xlw以及552408925
[root@www ~]# cut -d " " -f 2,5 file.txt |awk -F "," '{print $1,$2}'
[root@www ~]# awk '{print $2,$5}' file.txt |awk -F "," '{print $1,$2}'
[root@www ~]# awk -F '[, ]' '{print $2,$6}' file.txt
[root@www ~]# awk -F '[, ]+' '{print $2,$5}' file.txt? #參考
[root@www ~]# cut -d " " -f 2,5 file.txt|sed 's#,##g'
取列:cut awk(推薦)
替換:sed
取行:grep awk
#實(shí)現(xiàn)上述題目幾種思路
# cut -d " " -f2,5 file.txt
# cut -d " " -f2,5 file.txt |sed 's#,##g'
# sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}'
# awk? '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}'
# awk -F? "[, ]" '{print $2,$6}' file.txt
# awk -F '[, ]+' '{print $2,$5}' file.txt
過濾,取行
# awk '/root/' /etc/passwd
# awk '/^root/' /etc/passwd
----------------------------------------wc統(tǒng)計(jì)行號(hào)----------------------------------------
wc [OPTION]... [FILE]...
#選項(xiàng):-l顯示文件行數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -c顯示文件字節(jié) -w顯示文件單詞
# wc -l /etc/fstab? ? ? #統(tǒng)計(jì)/etc/fstab文件有多少行
# wc -l /etc/services? #統(tǒng)計(jì)/etc/services 文件行號(hào)
#擴(kuò)展方法
# grep -n "." /etc/services? | tail -1
# cat -n /etc/services? | tail -1
習(xí)題:過濾出/etc/passwd以nologin結(jié)尾的.并統(tǒng)計(jì)有多少行
# grep "nologin$" /etc/passwd | wc -l
習(xí)題:使用ifconfig獲取當(dāng)前的IP地址,使用sed\awk\grep取當(dāng)前服務(wù)器的ens32的IP地址
yum install net-tools -y #沒有ifconfig請(qǐng)安裝這個(gè)軟件包
1.我要取的值在哪
2.如何去縮小范圍,縮小到行,精確到列(想要的值)
# ifconfig ens32|grep "inet "|cut -d " " -f 10
# ifconfig ens32|grep "inet "|awk '{print $2}'
# ifconfig ens32|awk '/inet /'|awk '{print $2}'
# ifconfig ens32|awk '/inet /'|sed -r 's#^.*et (.*) net.*$#\1#g'? (擴(kuò)展)
awk取行
# ifconfig ens32|awk 'NR==2 {print $2}' #NR代表的是行號(hào),NR==2 代表要取輸出結(jié)果的第二行
sed取行
# ifconfig ens32|sed -n '2p'|awk '{print $2}'
# ifconfig ens32|sed -rn '2s#^.*et (.*) net.*$#\1#gp' (擴(kuò)展學(xué)習(xí))
習(xí)題: 分析如下日志彰檬,統(tǒng)計(jì)每個(gè)域名被訪問的次數(shù)。
[root@student tmp]# cat >> web.log <<EOF
http://www.xuliangwei.com/index.html
http://www.xuliangwei.com/1.html
http://post.xuliangwei.com/index.html
http://mp3.xuliangwei.com/index.html
http://www.xuliangwei.com/3.html
http://post.xuliangwei.com/2.html
EOF
1.提取域名
2.對(duì)域名進(jìn)行排序
3.對(duì)域名進(jìn)行去重,然后統(tǒng)計(jì)
# awk -F "/" '{print $3}' web.log |sort |uniq -c
# cat web.log |cut -d "/" -f3|sort|uniq -c
# sed -r 's#^.*//(.*)/.*$#\1#g' web.log #擴(kuò)展
習(xí)題:將該/etc/sysconfig/selinux文件中的SELINUX=enforcing替換為SELINUX=disabled
1.提取需要替換的內(nèi)容
2.模擬演練
3.真的修改
[root@www ~]# sed 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux
[root@www ~]# sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux
習(xí)題:將如下文件的內(nèi)容root和/bin/bash位置交換
[root@www ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
# awk '/^root/' /etc/passwd|awk -F ":" '{print $7":"$2":"$3":"$4":"$5":"$6":"$1}'
# awk -F ":" '/^root/ {print $7":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd
# sed -n '1p' /etc/passwd
# sed -n '1p' /etc/passwd|sed -r 's#(root)(.*)(/bin/bash)#\3\2\1#g'
# sed -n '2p' /etc/passwd|sed -r 's#(^.*1:)(.*)(/.*:)(/.*)(/.*)#\1\4\3\2\5#g'
6.linux文件屬性
[root@xuliangwei ~]# ls -l ks.cfg
-rw-------. 1 root root 4434 May 30 13:58 ks.cfg
#
-rw-------. ①:第一個(gè)字符是文件類型谎砾,其他則是權(quán)限
1? ? ? ? ? ②:硬鏈接次數(shù)
root? ? ? ? ③:文件屬于哪個(gè)用戶
root? ? ? ? ④:文件屬于哪個(gè)組
4434? ? ? ? ⑤:文件大小
May30 13:58 ⑥⑦⑧:最新修改的時(shí)間與日期
ks.cfg? ? ? ⑨:文件或目錄名稱
7.linux文件類型
[root@www ~]# ll -d /etc/hosts /tmp /bin/ls? /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client
-rwxr-xr-x.? 1 root root 117680 Oct 31 03:16 /bin/ls
srw-rw-rw-.? 1 root root? ? ? 0 Apr? 3 16:57 /dev/log
brw-rw----.? 1 root disk? 8, 0 Apr? 3 16:57 /dev/sda
crw--w----.? 1 root tty? ? 4, 1 Apr? 3 16:57 /dev/tty1
lrwxrwxrwx.? 1 root root? ? 22 Mar 28 03:33 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--.? 1 root root? ? 158 Apr? 1 18:09 /etc/hosts
prw-------.? 1 root root? ? ? 0 Apr? 3 16:57 /run/dmeventd-client
drwxrwxrwt. 22 root root? 4096 Apr? 3 20:57 /tmp
- 通常指的是文件
s socket文件(mysql)
b block 塊設(shè)備(磁盤\分區(qū)光盤)
c 字符設(shè)備
l 鏈接文件(呈現(xiàn)淺藍(lán)色)
d 目錄文件(呈現(xiàn)藍(lán)色狀態(tài))
第二種方式:
當(dāng)無法通過ls -l的屬性識(shí)別該文件是什么類型時(shí),可以通過file進(jìn)行查看
我們會(huì)將文件標(biāo)注對(duì)應(yīng)的后綴.
.txt
.sh
.mp3
.mp4
.exe
.zip
Linux的文件加上后綴能夠便于我們快速的識(shí)別.這個(gè)文件是什么類型.
linux系統(tǒng)鏈接文件
軟鏈接? 其實(shí)就是通過inode指向block
#軟鏈接使用場(chǎng)景
1.軟件升級(jí)
2.企業(yè)代碼發(fā)布
3.不方便目錄移動(dòng)
[root@www ~]# ll
total 0
lrwxrwxrwx. 1 root root 14 Apr? 3 23:47 qq -> /root/qq_v1.1/
#先執(zhí)行刪除,然后執(zhí)行l(wèi)n操作, && (&&前面的命令執(zhí)行成功,則立即執(zhí)行&&后面的命令)
[root@www ~]# rm -f /root/qq && ln -s /root/qq_v1.2/ /root/qq #版本升級(jí)
[root@www ~]# rm -f /root/qq && ln -s /root/qq_v1.1/ /root/qq #版本回退
5.硬鏈接與軟鏈接區(qū)別
1)ln命令創(chuàng)建硬鏈接逢倍,ln -s命令創(chuàng)建軟鏈接。
2)目錄不能創(chuàng)建硬鏈接景图,并且硬鏈接不可以跨越分區(qū)系統(tǒng)较雕。
3)目錄軟鏈接特別常用, 并且軟鏈接支持跨越分區(qū)系統(tǒng)。
4)硬鏈接文件與源文件的inode相同,軟鏈接文件與源文件inode不同亮蒋。
5)刪除軟鏈接文件扣典,對(duì)源文件及硬鏈接文件無任何影響。
6)刪除文件的硬鏈接文件慎玖,對(duì)源文件及鏈接文件無任何影響贮尖。
7)刪除鏈接文件的源文件,對(duì)硬鏈接無影響趁怔,會(huì)導(dǎo)致軟鏈接失效湿硝。
8)刪除源文件及其硬鏈接文件,整個(gè)文件會(huì)被真正的刪除痕钢。
總結(jié):
1.符號(hào)鏈接就是軟鏈接图柏,類似于快捷方式,inodeid不同任连,刪除源文件蚤吹,則軟鏈接失效.
2.硬鏈接則是擁有相同inodeid的文件,只有刪除所有文件后随抠,才會(huì)失效.
面試題: 當(dāng)前的磁盤空間還剩余500GB,但就是無法往里面寫入數(shù)據(jù).
No space left on device 要不是真的沒有磁盤空間(),要么就是inode被沾滿
8.linux命令執(zhí)行流程(擴(kuò)展)
ping? 探測(cè)對(duì)端主機(jī)是否存活
1) 命令是否通過絕對(duì)路徑執(zhí)行
2) 命令是否存在alias別名
3) 用戶輸入的是shell內(nèi)置命令還是外置命令 type -a
4) Bash內(nèi)部命令直接執(zhí)行裁着,外部命令檢測(cè)是否存在緩存
5) 查找系統(tǒng)全局$PATH,變量中保存的全部都是命令存放的路徑,有執(zhí)行,無報(bào)錯(cuò)command not found
2.什么是內(nèi)部命令拱她,什么是外部命令
內(nèi)部命令: shell程序自帶的命令二驰。
外部命令: 在系統(tǒng)PATH變量的某個(gè)路徑下的可執(zhí)行程序。
3.如何檢查用戶輸入的命令是內(nèi)部命令還是外部命令
#cd命令屬于shell內(nèi)部命令
[root@linux-node1 ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd
#ping屬于外部命令, 同時(shí)會(huì)打印當(dāng)前命令路徑
[root@xuliangwei ~]# type -a? ping
ping is /bin/ping
4.如果是外置命令秉沼,Bash可以通過查找PATH變量桶雀,獲取該命令的絕對(duì)路徑。
#打印當(dāng)前環(huán)境變量目錄
[root@xuliangwei ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PS: PATH由多個(gè)路徑組成唬复,每個(gè)路徑值之間用冒號(hào)間隔矗积,對(duì)這些路徑的增加和刪除操作都將影響到Bash解釋器對(duì)Linux命令的查找
5.如果是外置命令還會(huì)涉及到一個(gè)內(nèi)存緩存,也就是說敞咧,當(dāng)我們出現(xiàn)重復(fù)執(zhí)行相同的命令棘捣,會(huì)通過緩存調(diào)取執(zhí)行,也就意味著不會(huì)搜索PATH路徑休建。
#表緩存命令所在位置
[root@xuliangwei ~]# hash
hits? ? command
? 1? ? /usr/bin/tty
? 3? ? /sbin/ifconfig
#已緩存命令,如果移動(dòng)位置會(huì)導(dǎo)致無法找到該命令
[root@xuliangwei ~]# mv /sbin/ifconfig /bin/
[root@xuliangwei ~]# ifconfig
-bash: /sbin/ifconfig: No such file or directory
#刪除緩存過的ifconfig命令, 即可執(zhí)行
[root@xuliangwei ~]# hash -d ifconfig
[root@xuliangwei ~]# ifconfig
#當(dāng)然可以清空緩存表
[root@xuliangwei ~]# hash -r
#注意: 命令緩存hash需要注意如下情況:
1.只要執(zhí)行外部命令1次就會(huì)對(duì)該命令進(jìn)行緩存
2.如果將命令移動(dòng)了位置乍恐,該如何執(zhí)行
? ? a.使用絕對(duì)路徑執(zhí)行
? ? b.刪除hash表的緩存指令
6.命令執(zhí)行流程總結(jié): 當(dāng)我們執(zhí)行了一個(gè)ping命令之后, 整個(gè)命令執(zhí)行的流程步驟如下:
1) 檢查執(zhí)行的命令是否使用的是絕對(duì)路徑執(zhí)行的。
2) 檢查ping命令是否存在alias別名
3) 檢查ping命令是內(nèi)部命令還是外部命令
4) 如果是內(nèi)部命令Bash直接執(zhí)行测砂,如果是外部命令茵烈,首先檢查Hash緩存,存在則直接調(diào)取
5) 如果該命令不存在Hash緩存砌些,則通過PATH路徑進(jìn)行逐行查找該命令所在的位置
6) 如果PATH路徑?jīng)]有查找到該命令所在的路徑瞧毙,則返回錯(cuò)誤碼。command not found
/bin/ls 通過絕對(duì)路徑執(zhí)行
ls #alias hash $PATH
--------------------------------------------------
1.文件排序 sort
2.文件去重? uniq
3.文件截取? cut awk sed
4.文件統(tǒng)計(jì)? wc
5.文件屬性? 文件類型? 第一種: ls -l? 第二種file
6.鏈接文件
文件的存儲(chǔ)方式
用戶數(shù)據(jù) 存的是真的block數(shù)據(jù) block
元數(shù)據(jù) 存儲(chǔ)的文件的權(quán)限\用戶信息\大小\時(shí)間等等 但不存儲(chǔ)文件名稱. inode
軟連接,快捷方式
軟件升級(jí)
代碼發(fā)布
硬鏈接,不同的文件名使用相同的inode
7.擴(kuò)展:命令的執(zhí)行流程
1.絕對(duì)路徑
2.檢查該命令是否存在別名
3.檢查shell內(nèi)置,還是外置,內(nèi)置執(zhí)行,外置檢查緩存,檢查path路徑,提示command not found