日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux中的高级文本处理命令,cut命令,sed命令,awk命令

發布時間:2024/9/27 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux中的高级文本处理命令,cut命令,sed命令,awk命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.2.1 cut命令?

cut命令可以從一個文本文件或者文本流中提取文本列。

?

cut語法

[root@www ~]# cut -d'分隔字符' -f fields????## 用于有特定分隔字符

[root@www ~]# cut -c 字符區間??????????? ## 用于排列整齊的信息

選項與參數:

-d:后面接分隔字符。與 -f 一起使用;

-f:依據 -d 的分隔字符將一段信息分割成為數段,用 -f 取出第幾段的意思;

-c:以字符 (characters) 的單位取出固定字符區間;

?

PATH 變量如下

[root@www ~]#echo $PATH

?/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

# 1 | 2?????? | 3??| 4?????? | 5??????????? | 6??????????? | 7

?

?

將 PATH 變量取出,找出第五個路徑。

# echo $PATH |cut -d':' -f 5

/usr/local/bin

?

?

將 PATH 變量取出,找出第三和第五個路徑。

#echo $PATH |cut -d ':' -f 3,5

/sbin:/usr/local/bin

?

?

將 PATH 變量取出,找出第三到最后一個路徑。

echo $PATH | cut-d ':' -f 3-

/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

?

將 PATH 變量取出,找出第一到第三個路徑。

#echo $PATH |cut -d ':' -f 1-3

/bin:/usr/bin:/sbin:

?

將 PATH 變量取出,找出第一到第三,還有第五個路徑。

#echo $PATH |cut -d ':' -f 1-3,5

/bin:/usr/bin:/sbin:/usr/local/bin

?

實用例子:只顯示/etc/passwd的用戶和shell

#cat /etc/passwd| cut -d ':' -f 1,7

root:/bin/bash

daemon:/bin/sh

bin:/bin/sh

1.2.2 sed命令

注意測試下面的命令的時候不要用系統的文件,不要用/etc/passwd

準備的文件名是:test.txt文件,文件內容如下:

1??? zhangsan??? test??? http://www.baidu.com??? 2015-12-31

2??? lisi??? add??? https://www.jd.com??? 2016-03-20

3??? wangwu??? test??? http://v.hao123.com/dianshi??? 2017-01-01

4??? zhaoliu??? goshopping10??? http://v.hao123.com/dianshi??? 2017-01-01

192.168.0.1??? zhao10??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

6??? qian?? 10test??? http://v.hao123.com/dianshi??? 2017-01-01

192.168.0.1??? sun??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

8??? li??? loveable??? http://v.hao123.com/dianshi??? 2017-01-01

9??? zhou??? test??? http://v.hao123.com/dianshi??? 2017-01-01

test??? wu??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

12??? zheng??? 10goshopping10??? http://v.hao123.com/dianshi??? 2017-01-01

192.168.0.1??? check??? gotest??? http://v.hao123.com/dianshi??? 2017-01-01

14??? feng??? loveable??? http://v.hao123.com/dianshi??? 2017-01-01

15??? chen??? loveable??? http://v.hao123.com/dianshi??? 2017-01-01

16??? chu??? loveable??? http://v.hao123.com/dianshi??? 2017-01-01

192.168.0.1??? wei??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

18??? jiang??? gotestpping??? http://v.hao123.com/dianshi??? 2017-01-01

19??? shen??? check??? http://v.hao123.com/dianshi??? 2017-01-01

20??? han??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

192.168.0.1??? yang??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

192.168.0.1??? zhu??? testing??? http://v.hao123.com/dianshi??? 2017-01-01

23??? qin??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

24??? you??? test??? http://v.hao123.com/dianshi??? 2017-01-01

test??? xu??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

26??? he??? goshopping??? http://v.hao123.com/dianshi??? 2017-01-01

?

1/ 刪除:d命令

$ sed '2d' test.txt?? ?????? ??????? -----刪除example文件的第二行。

$ sed '2,$d' test.txt? ???? ??????? -----刪除example文件的第二行到末尾所有行。

$ sed '$d' test.txt? ???????? ??????? ????-----刪除example文件的最后一行。

$ sed '/test/'d test.txt???? ??? -----刪除example文件所有包含test的行。

?

2/ 替換:s命令

$ sed's/test/mytest/g' test.txt?????? ???????? ???????? ????????

##?在整行范圍內把test替換為mytest。如果沒有g標記,則只有每行第一個匹配的test被替換成mytest。

?

$ sed-n 's/^test/mytest/p' test.txt???????? ???????? ????????

##?(-n)選項和p標志一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。

?

$ sed's/^192.168.0.1/&localhost/' test.txt?? ????????

##?&符號表示追加一個串到找到的串后。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。

?

$ sed -n's/\(love\)able/\1rs/p' test.txt

##?love被標記為1,所有loveable會被替換成lovers,而且替換的行會被打印出來。

?

$ sed's#10#100#g' test.txt

##?不論什么字符,緊跟著s命令的都被認為是新的分隔符,所以,“#”在這里是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100。

選定行的范圍:逗號

?

$ sed -n'/test/,/check/p' test.txt

## 所有在模板test和check所確定的范圍內的行都被打印。

?

$ sed -n'5,/^test/p' test.txt

## 打印從第五行開始到第一個包含以test開始的行之間的所有行。

?

$ sed'/test/,/check/s/$/sed test/' test.txt

## 對于模板test和west之間的行,每行的末尾用字符串sed test替換。

多點編輯:e命令

?

$ sed -e '15,25d'-e 's/test/check/' test.txt

##?(-e)選項允許在同一行里執行多條命令。如例子所示,第一條命令刪除15至25行,第二條命令用check替換test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結果。

?

$ sed--expression='s/test/check/' --expression='/love/d' test.txt

## 一個比-e更好的命令是--expression。它能給sed表達式賦值。(通過上面的命令將所有的test替換成龍check,將所有的帶有love的行刪除掉了)

?

3/ 從文件讀入:r命令

$ sed '/test/rfile' test.txt

-----file里的內容被讀進來,顯示在與test匹配的行下面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。

?

4/ 寫入文件:w命令

$ sed -n'/test/w file' test.txt

-----在example中所有包含test的行都被寫入file里。

?

5/ 追加命令:a命令

$ sed'/^test/a\\--->this is a example' test.txt???

##?'--->this is a example'被追加到以test開頭的行后面,sed要求命令a后面有一個反斜杠。

?

?

6/ 插入:i命令

$ sed '/test/i\\some thing new-------------------------' test.txt

如果test被匹配,則把反斜杠后面的文本插入到匹配行的前面。

?

7/ 下一個:n命令

$ sed '/test/{ n; s/aa/bb/; }' test.txt

-----如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb,并打印該行,然后繼續。

?

8/ 退出:q命令

$ sed '10q' test.txt

-----打印完第10行后,退出sed。

?

1.2.3 awk命令

awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。

?

?

假設last -n 5的輸出如下

[root@www ~]#last -n 5 ???????## 僅取出前五行

root????pts/1?? 192.168.1.100? Tue Feb 10 11:21?? still logged in

root????pts/1?? 192.168.1.100? Tue Feb 10 00:46 - 02:28? (01:41)

root????pts/1?? 192.168.1.100? Mon Feb?9 11:41 - 18:30? (06:48)

dmtsai??pts/1?? 192.168.1.100? Mon Feb?9 11:41 - 11:41? (00:00)

root????tty1?????????????????? FriSep? 5 14:09 - 14:10? (00:01)

?

如果只是顯示最近登錄的5個帳號

# last -n 5 |awk? '{print $1}'

root

root

root

dmtsai

root

awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。默認域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。

?

?

?

如果只是顯示/etc/passwd的賬戶

# cat/etc/passwd |awk? -F ':'? '{print $1}'?

root

daemon

bin

sys

這種是awk+action的示例,每行都會執行action{print $1}。

-F指定域分隔符為':'

?

?

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

#cat /etc/passwd|awk? -F ':'? '{print $1"\t"$7}'

root???/bin/bash

daemon?/bin/sh

bin????/bin/sh

sys????/bin/sh

?

?

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

cat/etc/passwd |awk? -F ':'? 'BEGIN {print "name,shell"}? {print $1","$7} END {print "blue,/bin/nosh"}'

name,shell

root,/bin/bash

daemon,/bin/sh

bin,/bin/sh

sys,/bin/sh

....

blue,/bin/nosh

?

awk工作流程是這樣的:先執行BEGING,然后讀取文件,讀入有/n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨后開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執行END操作。

?

?

搜索/etc/passwd有root關鍵字的所有行

#awk? -F:?'/root/' ?/etc/passwd

root:x:0:0:root:/root:/bin/bash

這種是pattern的使用示例,匹配了pattern(這里是root)的行才會執行action(沒有指定action,默認輸出每行的內容)。

?

搜索支持正則,例如找root開頭的: awk -F:? '/^root/'? /etc/passwd

搜索/etc/passwd有root關鍵字的所有行,并顯示對應的shell

# awk? -F':'?'/root/{print $7}'?/etc/passwd? ???????????

/bin/bash

?這里指定了action{print$7}

?

?

統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:

#awk? -F ':'?'{print "filename:" FILENAME ",linenumber:" NR",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh

filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

?

?

使用printf替代print,可以讓代碼更加簡潔,易讀

?awk? -F':'?'{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'/etc/passwd

總結

以上是生活随笔為你收集整理的Linux中的高级文本处理命令,cut命令,sed命令,awk命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。