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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宙彪,隨后出現(xiàn)的幾起案子矩动,更是在濱河造成了極大的恐慌,老刑警劉巖释漆,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悲没,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡男图,警方通過查閱死者的電腦和手機(jī)示姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逊笆,“玉大人栈戳,你說我怎么就攤上這事∧疡桑” “怎么了子檀?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乃戈。 經(jīng)常有香客問我褂痰,道長(zhǎng),這世上最難降的妖魔是什么症虑? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任缩歪,我火速辦了婚禮,結(jié)果婚禮上谍憔,老公的妹妹穿的比我還像新娘匪蝙。我一直安慰自己,他們只是感情好习贫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布逛球。 她就那樣靜靜地躺著,像睡著了一般沈条。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诅炉,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天蜡歹,我揣著相機(jī)與錄音,去河邊找鬼涕烧。 笑死月而,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的议纯。 我是一名探鬼主播父款,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了憨攒?” 一聲冷哼從身側(cè)響起世杀,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肝集,沒想到半個(gè)月后瞻坝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杏瞻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年所刀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捞挥。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浮创,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砌函,到底是詐尸還是另有隱情斩披,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布胸嘴,位于F島的核電站雏掠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏劣像。R本人自食惡果不足惜乡话,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耳奕。 院中可真熱鬧绑青,春花似錦、人聲如沸屋群。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芍躏。三九已至邪乍,卻和暖如春酥筝,著一層夾襖步出監(jiān)牢的瞬間或油,已是汗流浹背偿短。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工袁梗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愿待,地道東北人虱黄。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓失暂,卻偏偏與公主長(zhǎng)得像遥金,于是被迫代替她去往敵國(guó)和親临燃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睛驳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容