2020-03-29 sort uniq cut sed grep awk wc 等 linux命令的使用與案例

1.文件管理之:字符處理命令(sort、uniq、cut、sed、grep、awk、wc、)

----------------------------------------sort排序----------------------------------------

在有些情況下,需要對(duì)應(yīng)一個(gè)無(wú)序的文本文件進(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è)文件,寫(xiě)入一寫(xiě)無(wú)序的內(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, 按照字符來(lái)排序確實(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è)問(wèn)題(但是必須配合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ì)訪問(wèn)量最高的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? #過(guò)濾出文件里 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

過(guò)濾,取行

# 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í)題:過(guò)濾出/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 #沒(méi)有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è)域名被訪問(wèn)的次數(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è)備(磁盤(pán)\分區(qū)光盤(pán))

c 字符設(shè)備

l 鏈接文件(呈現(xiàn)淺藍(lán)色)

d 目錄文件(呈現(xiàn)藍(lán)色狀態(tài))

第二種方式:

當(dāng)無(wú)法通過(guò)ls -l的屬性識(shí)別該文件是什么類型時(shí),可以通過(guò)file進(jìn)行查看

我們會(huì)將文件標(biāo)注對(duì)應(yīng)的后綴.

.txt

.sh

.mp3

.mp4

.exe

.zip

Linux的文件加上后綴能夠便于我們快速的識(shí)別.這個(gè)文件是什么類型.

linux系統(tǒng)鏈接文件

軟鏈接? 其實(shí)就是通過(guò)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ì)源文件及硬鏈接文件無(wú)任何影響。

6)刪除文件的硬鏈接文件,對(duì)源文件及鏈接文件無(wú)任何影響。

7)刪除鏈接文件的源文件,對(duì)硬鏈接無(wú)影響,會(huì)導(dǎo)致軟鏈接失效。

8)刪除源文件及其硬鏈接文件,整個(gè)文件會(huì)被真正的刪除。

總結(jié):

1.符號(hào)鏈接就是軟鏈接,類似于快捷方式,inodeid不同,刪除源文件,則軟鏈接失效.

2.硬鏈接則是擁有相同inodeid的文件,只有刪除所有文件后,才會(huì)失效.

面試題: 當(dāng)前的磁盤(pán)空間還剩余500GB,但就是無(wú)法往里面寫(xiě)入數(shù)據(jù).

No space left on device 要不是真的沒(méi)有磁盤(pán)空間(),要么就是inode被沾滿

8.linux命令執(zhí)行流程(擴(kuò)展)

ping? 探測(cè)對(duì)端主機(jī)是否存活

1) 命令是否通過(guò)絕對(duì)路徑執(zhí)行

2) 命令是否存在alias別名

3) 用戶輸入的是shell內(nèi)置命令還是外置命令 type -a

4) Bash內(nèi)部命令直接執(zhí)行,外部命令檢測(cè)是否存在緩存

5) 查找系統(tǒng)全局$PATH,變量中保存的全部都是命令存放的路徑,有執(zhí)行,無(wú)報(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可以通過(guò)查找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)存緩存,也就是說(shuō),當(dāng)我們出現(xiàn)重復(fù)執(zhí)行相同的命令,會(huì)通過(guò)緩存調(diào)取執(zhí)行,也就意味著不會(huì)搜索PATH路徑。

#表緩存命令所在位置

[root@xuliangwei ~]# hash

hits? ? command

? 1? ? /usr/bin/tty

? 3? ? /sbin/ifconfig

#已緩存命令,如果移動(dòng)位置會(huì)導(dǎo)致無(wú)法找到該命令

[root@xuliangwei ~]# mv /sbin/ifconfig /bin/

[root@xuliangwei ~]# ifconfig

-bash: /sbin/ifconfig: No such file or directory

#刪除緩存過(guò)的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緩存,則通過(guò)PATH路徑進(jìn)行逐行查找該命令所在的位置

6) 如果PATH路徑?jīng)]有查找到該命令所在的路徑,則返回錯(cuò)誤碼。command not found

/bin/ls 通過(guò)絕對(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容