国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Shell文本處理常用工具

2019-11-08 01:43:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文將介紹linux下使用Shell處理文本時(shí)最常用的工具:

find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;

提供的例子和參數(shù)都是最常用和最為實(shí)用的;

我對(duì)shell腳本使用的原則是命令單行書(shū)寫(xiě),盡量不要超過(guò)2行;

如果有更為復(fù)雜的任務(wù)需求,還是考慮python吧;

find 文件查找

find . /( -name "*.txt" -o -name "*.pdf" /) -PRint

find . -regex ".*/(/.txt|/.pdf/)$"

-iregex: 忽略大小寫(xiě)的正則

否定參數(shù)

查找所有非txt文本

find . ! -name "*.txt" -print

指定搜索深度

打印出當(dāng)前目錄的文件(深度為1)

find . -maxdepth 1 -type f

定制搜索

按大小搜索:

w字 k M G

尋找大于2k的文件

按權(quán)限查找:

刪除:

刪除當(dāng)前目錄下所有的swp文件:

注:{}是一個(gè)特殊的字符串,對(duì)于每一個(gè)匹配的文件,{}會(huì)被替換成相應(yīng)的文件名;

eg:將找到的文件全都copy到另一個(gè)目錄:

find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD /;

結(jié)合多個(gè)命令

tips: 如果需要后續(xù)執(zhí)行多個(gè)命令,可以將多個(gè)命令寫(xiě)成一個(gè)腳本。然后 -exec 調(diào)用時(shí)執(zhí)行腳本即可;

-exec ./commands.sh {} /;

-print的定界符

默認(rèn)使用'/n'作為文件的定界符;

-print0 使用'/0'作為文件的定界符,這樣就可以搜索包含空格的文件;

grep 文本搜索

grep match_patten file // 默認(rèn)訪問(wèn)匹配行

常用參數(shù)

-o 只輸出匹配的文本行 VS -v 只輸出沒(méi)有匹配的文本行

-c 統(tǒng)計(jì)文件中包含文本的次數(shù)

在多級(jí)目錄中對(duì)文本遞歸搜索(程序員搜代碼的最愛(ài)):

xargs 命令行參數(shù)轉(zhuǎn)換

xargs 能夠?qū)⑤斎霐?shù)據(jù)轉(zhuǎn)化為特定命令的命令行參數(shù);這樣,可以配合很多命令來(lái)組合使用。比如grep,比如find;

cat file.txt| xargs

/n 是多行文本間的定界符

cat single.txt | xargs -n 3

-n:指定每行顯示的字段數(shù)

-d 定義定界符 (默認(rèn)為空格 多行的定界符為 /n)

-n 指定輸出為多行

-I {} 指定替換字符串,這個(gè)字符串在xargs擴(kuò)展時(shí)會(huì)被替換掉,用于待執(zhí)行的命令需要多個(gè)參數(shù)時(shí)

cat file.txt | xargs -I {} ./command.sh -p {} -1

字段說(shuō)明:

-n 按數(shù)字進(jìn)行排序 VS -d 按字典序進(jìn)行排序

-r 逆序排序

-k N 指定按第N列排序

eg:

sort -nrk 1 data.txt

sort -bd data // 忽略像空格之類的前導(dǎo)空白字符

uniq 消除重復(fù)行

消除重復(fù)行

sort unsort.txt | uniq

sort unsort.txt | uniq -c

sort unsort.txt | uniq -d

可指定每行中需要比較的重復(fù)內(nèi)容:-s 開(kāi)始位置 -w 比較字符數(shù)

用tr進(jìn)行轉(zhuǎn)換

tr壓縮字符

tr -s 壓縮文本中出現(xiàn)的重復(fù)字符;最常用于壓縮多余的空格

字符類

tr中可用各種字符類:

alnum:字母和數(shù)字

alpha:字母

digit:數(shù)字

space:空白字符

lower:小寫(xiě)

upper:大寫(xiě)

cntrl:控制(非可打印)字符

print:可打印字符

使用方法:tr [:class:] [:class:]

截取文件的第2列和第4列:

cut -f2,4 filename

去文件除第3列的所有列:

cut -f3 --complement filename

cat -f2 -d";" filename

N- 第N個(gè)字段到結(jié)尾

-M 第1個(gè)字段為M

N-M N到M個(gè)字段

-b 以字節(jié)為單位

-c 以字符為單位

-f 以字段為單位(使用定界符)

cut -c1-5 file //打印第一到5個(gè)字符

cut -c-2 file //打印前2個(gè)字符

paste 按列拼接文本

默認(rèn)的定界符是制表符,可以用-d指明定界符

paste file1 file2 -d ","

1,colin

2,book

wc 統(tǒng)計(jì)行和字符的工具

wc -l file // 統(tǒng)計(jì)行數(shù)

wc -w file // 統(tǒng)計(jì)單詞數(shù)

wc -c file // 統(tǒng)計(jì)字符數(shù)

sed 文本替換利器

首處替換

seg 's/text/replace_text/' file //替換每一行的第一處匹配的text

seg 's/text/replace_text/g' file

默認(rèn)替換后,輸出替換后的內(nèi)容,如果需要直接替換原文件,使用-i:

seg -i 's/text/repalce_text/g' file

sed '/^$/d' file

已匹配的字符串通過(guò)標(biāo)記&來(lái)引用.

echo this is en example | seg 's//w+/[&]/g'

$>[this] [is] [en] [example]

第一個(gè)匹配的括號(hào)內(nèi)容使用標(biāo)記 /1 來(lái)引用

sed 's/hello/([0-9]/)//1/'

sed通常用單引號(hào)來(lái)引用;也可使用雙引號(hào),使用雙引號(hào)后,雙引號(hào)會(huì)對(duì)表達(dá)式求值:

當(dāng)使用雙引號(hào)時(shí),我們可以在sed樣式和替換字符串中指定變量;

eg:

其它示例

字符串插入字符:將文本中每行內(nèi)容(PEKSHA) 轉(zhuǎn)換為 PEK/SHA

sed 's/^./{3/}/&///g' file

awk 數(shù)據(jù)流處理工具

awk腳本結(jié)構(gòu)

awk ' BEGIN{ statements } statements2 END{ statements } '

工作方式

1.執(zhí)行begin中語(yǔ)句塊;

2.從文件或stdin中讀入一行,然后執(zhí)行statements2,重復(fù)這個(gè)過(guò)程,直到文件全部被讀取完畢;

3.執(zhí)行end語(yǔ)句塊;

print 打印當(dāng)前行

使用不帶參數(shù)的print時(shí),會(huì)打印當(dāng)前行;

print 以逗號(hào)分割時(shí),參數(shù)以空格定界;

echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; /

print var1, var2 , var3; }'

$>v1 V2 v3

使用-拼接符的方式(""作為拼接符);

echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; /

print var1"-"var2"-"var3; }'

$>v1-V2-v3

特殊變量: NR NF $0 $1 $2

NR:表示記錄數(shù)量,在執(zhí)行過(guò)程中對(duì)應(yīng)當(dāng)前行號(hào);

NF:表示字段數(shù)量,在執(zhí)行過(guò)程總對(duì)應(yīng)當(dāng)前行的字段數(shù);

$0:這個(gè)變量包含執(zhí)行過(guò)程中當(dāng)前行的文本內(nèi)容;

$1:第一個(gè)字段的文本內(nèi)容;

$2:第二個(gè)字段的文本內(nèi)容;

打印每一行的第二和第三個(gè)字段:

awk '{print $2, $3}' file

統(tǒng)計(jì)文件的行數(shù):

awk ' END {print NR}' file

累加每一行的第一個(gè)字段:

echo -e "1/n 2/n 3/n 4/n" | awk 'BEGIN{num = 0 ;

print "begin";} {sum += $1;} END {print "=="; print sum }'

傳遞外部變量

用樣式對(duì)awk處理的行進(jìn)行過(guò)濾

awk 'NR < 5' #行號(hào)小于5

awk 'NR==1,NR==4 {print}' file #行號(hào)等于1和4的打印出來(lái)

awk '/linux/' #包含linux文本的行(可以用正則表達(dá)式來(lái)指定,超級(jí)強(qiáng)大)

awk '!/linux/' #不包含linux文本的行

使用-F來(lái)設(shè)置定界符(默認(rèn)為空格)

awk -F: '{print $NF}' /etc/passwd

讀取命令輸出

使用getline,將外部shell命令的輸出讀入到變量cmdout中;

在awk中使用循環(huán)

for(i=0;i<10;i++){print $i;}

for(i in array){print array[i];}

eg:

以逆序的形式打印行:(tac命令的實(shí)現(xiàn))

seq 9| /

awk '{lifo[NR] = $0; lno=NR} /

END{ for(;lno>-1;lno--){print lifo[lno];}

} '

awk實(shí)現(xiàn)head、tail命令

awk 'NR<=10{print}' filename

awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ /

print buffer[i %10]} } ' filename

打印指定列

awk方式實(shí)現(xiàn):

ls -lrt | awk '{print $6}'

cut方式實(shí)現(xiàn)

ls -lrt | cut -f6

打印指定文本區(qū)域

seq 100| awk 'NR==4,NR==6{print}'

確定文本

打印處于start_pattern 和end_pattern之間的文本;

awk '/start_pattern/, /end_pattern/' filename

eg:

seq 100 | awk '/13/,/15/'

cat /etc/passwd| awk '/mai.*mail/,/news.*news/'

index(string,search_string):返回search_string在string中出現(xiàn)的位置

sub(regex,replacement_str,string):將正則匹配到的第一處內(nèi)容替換為replacement_str;

match(regex,string):檢查正則表達(dá)式是否能夠匹配字符串;

length(string):返回字符串長(zhǎng)度

printf 類似c語(yǔ)言中的printf,對(duì)輸出進(jìn)行格式化

eg:

seq 10 | awk '{printf "->%4s/n", $1}'

迭代文件中的行、單詞和字符

1. 迭代文件中的每一行

改成子shell:

cat file.txt | (while read line;do echo $line;done)

cat file.txt| awk '{print}'

3. 迭代每一個(gè)字符


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛坪县| 富源县| 南京市| 甘南县| 阿拉尔市| 荣昌县| 化州市| 临沧市| 天柱县| 大姚县| 九寨沟县| 北流市| 灵山县| 蓬莱市| 锡林浩特市| 临汾市| 怀化市| 资源县| 囊谦县| 德令哈市| 姚安县| 通化市| 吉安市| 六枝特区| 灵石县| 竹北市| 宾川县| 阜康市| 错那县| 靖州| 应用必备| 榆林市| 成武县| 义乌市| 祁门县| 哈密市| 枣强县| 油尖旺区| 肃南| 自贡市| 互助|