BigData Linux cut-sort-wc-uniq-tee-tr-split-awk-sed命令實戰

管道相關命令

1.1 cut

cut:以某種方式按照文件的行進行分割

參數列表

-b 按字節選取 忽略多字節字符邊界,除非也指定了 -n 標誌

-c 按字符選取

-d 自定義分隔符,默認爲製表符。

-f 與-d一起使用,指定顯示哪個區域。

範圍控制:

​ n:只有第n項

​ n-:從第n項一直到行尾

​ n-m:從第n項到第m項(包括m)

準備工作

vim 1.txt

111:aaa:bbb:ccc
222:ddd:eee:fff
333:ggg:hhh
444:iii

cat 1.txt | cut -c 1

練習1 截取出1.txt文件中前2行的第5個字符

答案:

head -2 1.txt | cut -c 5

練習2 截取出1.txt文件中前2行以”:”進行分割的第1,2段內容

答案:

head -2 1.txt | cut -d ':' -f 1,2

或者

head -2 1.txt | cut -d ':' -f 1-2

練習3

截取出1.txt文件中前2行以”:”進行分割的第1,2,3段內容

答案:

head -2 1.txt | cut -d ':' -f 1,2,3

或者

 head -2 1.txt | cut -d ':' -f 1-3

1.2 sort 的 工作原理

1.2.1 基本使用

sort將文件的每一行作爲一個單位,相互比較,比較原則是從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。

[root@k8s-master tmp]# cat 01.txt
banana
apple
pear
orange
pear

[root@k8s-master tmp]# sort 01.txt 
apple
banana
orange
pear
pear

1.2.2 sort的-u選項

它的作用很簡單,就是在輸出行中去除重複行。

[root@k8s-master tmp]# sort -u 01.txt 
apple
banana
orange
pear

pear由於重複被-u選項無情的刪除了。

1. sort的-r 和 -n選項

[root@k8s-master tmp]# cat 02.txt 
1
3
5
7
11
2
4
6
10
8
9

sort默認的排序方式是升序

[root@k8s-master tmp]# sort 02.txt 
1
10
11
2
3
4
5
6
7
8
9

排序程序將這些數字按字符來排序了,排序程序會先比較1和2,顯然1小,所以就將10放在2前面

[root@k8s-master tmp]# sort -n 02.txt
1
2
3
4
5
6
7
8
9
10
11

-r表示降序,n表示按數字進行排序

[root@k8s-master tmp]# sort -n -r 02.txt
11
10
9
8
7
6
5
4
3
2
1

合併式

[root@k8s-master tmp]# sort -nr 02.txt  
11
10
9
8
7
6
5
4
3
2
1

1.3 wc命令

wc命令用於計算字數。

利用wc指令我們可以計算文件的Byte數、字數、或是列數,若不指定文件名稱、或是所給予的文件名爲"-",則wc指令會從標準輸入設備讀取數據。

1.3.1 語法


參數:

  • -c或–bytes或–chars 只顯示Bytes數。
  • -l或–lines 只顯示行數。
  • -w或–words 只顯示字數。
  • –help 在線幫助。
  • –version 顯示版本信息。

1.3.2 準備工作

111
222 bbb
333 aaa bbb 
444 aaa bbb ccc
555 aaa bbb ccc ddd
666 aaa bbb ccc ddd eee

1.3.3 需求: 統計指定文件行數 字數 字節數

在默認的情況下,wc將計算指定文件的行數、字數,以及字節數。使用的命令爲:

wc 文件名
使用 wc統計,結果如下:

[root@k8s-master ~]# wc 01.txt     
6 21 85 01.txt

wc 01.txt       # 01.txt 文件的統計信息
6 21 85 01.txt    # 01.txt文件: 行數爲6, 單詞數爲 21, 字節數爲 85
其中,3 個數字分別表示 01.txt文件的行數、單詞數,以及該文件的字節數。

1.3.4 需求: 統計多個文件的 行數 單詞數 字節數

如果想同時統計多個文件的信息,例如同時統計01.txt 、02.txt 、03.txt,可使用如下命令:

[root@k8s-master ~]# wc 01.txt 02.txt 03.txt
  6  21  85 01.txt
  2   3  12 02.txt
  3   6  25 03.txt
 11  30 122 總用量

1.3.5 需求: 查看 根目錄下有多少個文件

[root@k8s-master ~]# ls /
bin   cgroup  etc   lib    lost+found  misc  net  proc  sbin     srv  tmp  var
boot  dev     home  lib64  media       mnt   opt  root  selinux  sys  usr
[root@hadoop01 ~]# ls / | wc -w
23

1.4 uniq

uniq 命令用於檢查及刪除文本文件中重複出現的行,一般與 sort 命令結合使用。

1 參數說明:

-c 統計行數

2 準備工作

vim 5.txt

張三    98
李四    100
王五    90
趙六    95
麻七    70
李四    100
王五    90
趙六    95
麻七    70

3 練習1 去除5.txt中重複的行

答案:

cat 5.txt | sort | uniq

4 練習2 統計5.txt中每行內容出現的次數

答案:

cat 5.txt | sort | uniq -c

1.5 tee

tee 和 >類似,重定向的同時還在屏幕輸出
參數說明:
tee -a 內容追加 和 >> 類似

[root@k8s-master tmp]# echo 'aaa' | tee 1.txt
aaa

[root@k8s-master tmp]# cat 1.txt
aaa

[root@k8s-master tmp]# echo 'bbb' | tee -a 1.txt
bbb

[root@k8s-master tmp]# cat 1.txt
aaa
bbb

練習1 統計5.txt中每行內容出現的次數輸出到a.txt,並且把內容顯示在控制檯

答案:

sort 5.txt | uniq -c | tee a.txt

練習2 統計5.txt中每行內容出現的次數輸出追加到a.txt,並且把內容顯示在控制檯

答案:

sort 5.txt | uniq -c | tee -a a.txt

1.6 tr

Linux tr 命令用於轉換或刪除文件中的字符。
tr 指令從標準輸入設備讀取數據,經過字符串轉譯後,將結果輸出到標準輸出設備。

-d, --delete:刪除指令字符

練習1 把itheima的小寫i換成大寫I

答案:

echo "itheima" | tr 'i' 'I'

練習2 把itheima的小寫i和a換成大寫I和A

答案:

echo "itheima" | tr 'i' 'I' | tr 'a' 'A'

練習3 把itheima的轉換爲大寫

答案:

echo "itheima" |tr '[a-z]' '[A-Z]'

練習4
刪除abc1d4e5f中的數字

答案:

echo 'abc1d4e5f' | tr -d '[0-9]'


練習5 單詞計數

words.txt中的內容如下:
hello,world,hadoop
hive,sqoop,flume,hello
kitty,tom,jerry,world
hadoop


cat words.txt | tr -s ',' '\n' | sort | uniq -c | sort -r | awk '{print $2, $1}'


腳本解釋:

​ tr -s ’ ’ ‘\n’
​ 表示:連續出現的空格只保留一個,並在空格處以換行符分割文本

​ tr -s ‘,’ ‘\t’
​ 表示 ,使用 tab代替

​ sort
​ 表示:對輸出文本進行排序

​ uniq -c
​ 表示:對連續出現的重複的行進行計數

​ sort -r
​ 表示:對輸出文本進行降序排序

​ awk ‘{print $2, $1}’
​ 表示:打印出文本的第二列和第一列

1.7 split

該指令將大文件分割成較小的文件,在默認情況下將按照每1000行切割成一個小文件
參數說明:
-b<字節> : 指定每多少字節切成一個小文件
-l<行數> : 指定每多少行切成一個小文件

練習1 從/etc目錄下查找以conf結尾的文件,並所有文件內容寫入到v.txt

答案:

[root@k8s-master tmp]# find /etc/ -type f -name "*conf" -exec cat {} >> v.txt \;
[root@k8s-master tmp]# ll
總用量 420
-rw-r--r--. 1 root root 429746 3月  17 23:15 v.txt

[root@k8s-master tmp]# wc v.txt 
 12982  56922 429746 v.txt

練習2
把v.txt進行分割

答案:

split v.txt

練習3
把v.txt按2000進行分割

答案:

split -l 2000 v.txt

練習4 把v.txt按10k進行分割

答案:

du –sh v.txt

split -b 10k v.txt

hadoop數據的劃分, 這個是物理上真真實實的進行了劃分,數據文件上傳到HDFS裏的時候,需要劃分成一塊一塊,默認的每個塊128MB。

1.8 awk

1.8.1 簡介

awk是一種處理文本文件的命令,是一個強大的文本分析工具。但是比較複雜,不過功能比sed更加的強大,它支持分段。默認每行按空格或TAB分割。

1.1 選項參數說明:
-F 指定輸入文件折分隔符

1.8.2 默認分段

默認每行按空格或TAB分割,使用$n來獲取段號

vim 1.txt

aaa 111 333
bbb 444 555
ccc 666 777 888
ddd 999 222 999

練習1 創建1.txt,輸入內容,打印出第1段

答案:

awk '{print $1}' 1.txt

練習2
打印出1.txt的第1,2,3段

答案:

awk '{print $1,$2,$3}' 1.txt

練習3
打印出1.txt的第1,2,3段,並且使用#號連接

答案:

awk '{print $1"#"$2"#"$3}' 1.txt

1.8.3 段之間的連接符OFS

練習1

打印1,2,3段,指定#爲連接符

答案:

awk '{OFS="#"}{print $1,$2,$3}' 1.txt


1.8.4 指定分隔符

-F 來指定分隔符

  • 準備工作

vim 2.txt

aaa:111:333
bbb:444:555
ccc:666:777:888
ddd:999:222:999:cccc

練習1

打印出2.txt的第1段

答案:

awk -F ':' '{print $1}' 2.txt

練習2

打印出2.txt的所有段

答案:

awk -F ':' '{print $0}' 2.txt

練習3

打印出2.txt的第1,3段

答案:

awk -F ':' '{print $1,$3}' 2.txt

1.8.5 內容匹配

練習1 匹配2.txt中包含cc的內容

答案:

awk '/cc/' 2.txt

練習2

匹配2.txt中第1段包含cc的內容

答案:

awk -F ':' '$1 ~ /cc/' 2.txt

練習3

匹配2.txt中第1段包含至少連續兩個c的內容

答案:

awk -F ':' '$1 ~ /cc+/' 2.txt

練習4

在2.txt中如果匹配到aaa就打印第1,3段,如果匹配到ccc,就打印第1,3,4段

答案:

awk -F ':' '/aaa/ {print $1,$3} /ccc/ {print $1,$3,$4}' 1.txt

練習5

在2.txt中如果匹配到aaa或者ddd,就打印全部內容

答案:

awk -F ':' '/aaa|ddd/ {print $0}' 2.txt

1.8.6 段內容判斷

練習1

在2.txt中如果第3段等於222就打印所有內容

答案:

awk -F ':' '$3==222 {print $0}'  2.txt 

練習2

在2.txt中如果第3段等於333就打印第一段

答案:

awk -F ':' '$3==333 {print $1}'  2.txt

練習3

在2.txt中如果第3段大於等於300就打印第一段

答案:

awk -F ':' '$3>=300 {print $0}'  2.txt

練習4

在2.txt中如果第5段不等於cccc就打印全部

答案:

awk -F ':' '$5!="cccc" {print $0}' 2.txt

練習5

在2.txt中如果第1段等於ccc,並且第2段大於300就打印全部

答案:

awk -F ':' '$1=="ccc" && $2>300 {print $0}' 2.txt

練習6

在2.txt中如果第1段等於ccc,並且第2段匹配666就打印全部

答案:

awk -F ':' '$1=="ccc" && $2==666 {print $0}' 2.txt

1.8.7 段之間的比較

練習1

在2.txt中如果第3段小於第4段就打印全部

答案:

awk -F ':' '$3<$4 {print $0}'  2.txt

練習2

在2.txt中如果第2段等於第4段就打印全部

答案:

awk -F ':' '$2==$4 {print $0}' 2.txt

1.8.8 NR行號和 NF段數

練習1

打印2.txt全部內容顯示行號

答案:

awk -F ':' '{print NR " : " $0}'  2.txt

練習2

打印2.txt全部內容顯示段數

答案:

awk -F ':' '{print NF " : " $0}'  2.txt

練習3

打印2.txt前2行,並顯示行號 (用三種不同的方式實現)

答案:

nl 2.txt | head -2

nl 2.txt | sed -n -e '1,2p'
    
awk -F ':' 'NR<=2 {print NR " " $0}' 2.txt

練習4

打印2.txt前2行,並且第1段匹配 aaa或者eee,打印全部,打印行號 (用兩種方式)

答案:

nl 2.txt | head -2 | awk -F ':' '$1 ~ /aaa|eee/'

或者

awk -F ':' 'NR<=2 && $1 ~ /aaa|eee/ {print NR " " $0}'  2.txt

練習5 從2.txt的前3行中匹配出第2段等於 666,並顯示行號(用兩種方式)

答案:

nl passwd | head -n 3 | awk -F ":" '$7=="/sbin/nologin" {print $0}'

或者

awk -F ':' 'NR<=3 && $2==666 {print $0}' 2.txt

練習6

從2.txt前3行,把第1段內容替換爲itheima,指定分隔符爲|,顯示行號(用兩種方式)

答案:

nl 2.txt | head -3 | awk -F ':' '{OFS="|"} $1="itheima" {print NR "  " $0}'

或者

awk -F ':' '{OFS="|"} NR<=3 && $1="itheima" {print NR "  " $0}'  2.txt

1.8.9 分段求和

awk腳本,我們需要注意兩個關鍵詞BEGIN和END。
BEGIN{ 這裏面放的是執行前的語句 }
{這裏面放的是處理每一行時要執行的語句}
END {這裏面放的是處理完所有的行後要執行的語句 }

2.8.1 練習1 對2.txt中的第2段求和

答案:

awk -F ':' 'BEGING{}{total=total+$2}END{print total}'  2.txt

1.8.10 綜合練習

練習1

對統計awk目錄下所有文本文件的大小

答案:

ll | awk 'BEGIN{}{total=total+$5} END{print(total)}'

練習2 打印99乘法表

答案:

awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%dx%d=%d%s", i, j, i*j, "\t" )  } printf("\n")  }  }'

1.9 sed

簡介

sed命令是來處理文本文件。sed也可以實現grep的功能,但是要複雜一些。
它的強大之處在於替換。並且對於正則也是支持的。

  • 參數說明:

    -n 僅顯示處理後的結果
    -e 以選項中指定的腳本來處理輸入的文本文件
    -f 以選項中指定的腳本文件來處理輸入的文本文件

  • 動作說明:

    p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行
    d :刪除
    a :新增,內容出現在下一行
    i :插入, 內容出現在上一行
    c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行
    s :取代,可以直接進行取代的工作!通常這個 s 的動作可以搭配正規表示法!
    = :顯示行號

準備數據

vim 1.txt

aaa java root
bbb hello
ccc rt
ddd root nologin
eee rtt
fff ROOT nologin
ggg rttt


1.9.1-n和p的組合:查找

練習1

查找01.txt中包含root行

答案:

sed -n -e '/root/p' 01.txt

練習2

查找出01.txt中包含一個或多個r,r後面是t,並顯示行號

答案:

nl 01.txt | sed -nr -e '/r+t/p'

或者

sed -nr -e '/r+t/p' -e '/r+t/=' 01.txt

練習3

列出01.txt的第2行數據,並顯示行號

答案:

nl 01.txt | sed -n -e '2p'

練習4 列出01.txt的第2到第5行數據,並顯示行號

答案:

nl 01.txt |sed -n -e '2,5p'        # 顯示行號

練習5 列出01.txt全部的數據,並顯示行號

答案:

nl 01.txt
cat -n 01.txt
sed -n -e '1,$p' -e '1,$=' 01.txt

練習6

列出01.txt中包含root的內容,root不區分大小寫,並顯示行號

答案:

nl 01.txt | sed -n -e '/root/Ip'

nl 01.txt | grep -i root

cat -n 01.txt | grep -i root

1.9.2 d 刪除

練習1

刪除01.txt中前3行數據,並顯示行號

答案:

nl 01.txt | sed -e '1,3d'

練習2

保留01.txt中前4行數據,並顯示行號

答案:

nl 01.txt | sed -e '5,$d'

1.9.3 a 和i 添加

a:在行後面插入 (append)
i:在行前面插入 (insert)

練習1:

在01.txt的第二行後添加aaaaa,並顯示行號

答案:

nl 01.txt | sed '2a aaaaa'

練習2

在01.txt的第1行前添加bbbbb,並顯示行號

答案:

nl 01.txt | sed -e '1i bbbbb'

1.9.4 s和c替換

s:對字符串進入替換 c:對行進行替換

練習1

把01.txt中的nologin替換成爲itheima,並顯示行號

答案:

nl passwd | sed -e 's/nologin/itheima/'

練習2

把01.txt中的1,2行替換爲aaa,並顯示行號

答案:

nl passwd | sed -e '1,2c aaa'

1.9.5 對原文件進行操作

注意:在進行操作之前,最好是對數據進行備份,放置操作失誤,數據無法恢復!

練習1

刪除01.txt中前2行數據,並且刪除原文件中的數據

答案:

sed -i -e '1,2d' 01.txt



nl passwd 查看數據

練習2

在01.txt中把nologin替換爲itheima

答案:

sed -i -e 's/nologin/itheima/' 01.txt

練習3

在01.txt文件中第2、3行替換爲aaa

答案:

sed -i -e '2,3c aaa' 01.txt

1.9.6 綜合練習

練習1

獲取ip地址

答案:

ifconfig eth0 | grep 'inet addr:' | sed -e 's/^.addr://' | sed -e 's/Bcast.//'

練習2

從01.txt中提出數據,刪除前5行,並把nologin替換爲itheima,並顯示行號

答案:

nl 01.txt | sed -e '1,5d' | sed -e 's/nologin/itheima/'

練習3

從01.txt中提出數據,匹配出包含root的內容,再把nologin替換爲itheima

答案:

nl 01.txt | grep 'root' | sed -e 's/nologin/itheima/'

或者

nl 01.txt | sed -n -e '/root/p' | sed -e 's/nologin/itheima/'

或者

nl 01.txt | sed -n -e '/root/{s/nologin/itheima/p}' #只顯示替換內容的行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章