mac 文本處理命令分享

mac 文本處理命令分享

1 sed

默認sed命令只是對標準輸出作變動,不會影響到源文件,可是若是加了-i以後,會變動源文件。mac中的-i參數使用和linux有差別。後面只對mac的命令作說明。
-i '' i後加上備份文件名稱才能影響到源文件。''默認是和原文件名相同,不產生備份文件。

本測試的文件爲csophys。其中的內容以下:
cat csophys
I am the first line!
line second is me.

1.1 文本查找替換

sed -i '' 's/line/LINE/' csophys

1.2 文本插入

a在目標行以後插入,i在目標行以前插入。 css

sed '1 a\ 
insert
' csophys

sed '1 i\ 
insert
' csophys

sed '$line a\
xxxx
' file

$line這是目標行,也能夠用正則來定位全部匹配的行。 java

sed '/line/ i\ 
insert
' csophys

也能夠直接在匹配行以後插入其餘文件的內容,好比: linux

sed '/first/r command.org' csophys

1.3 文本行刪除

刪除文本中的行 sql

sed '/se.*/d' csophys

1.4 執行sed腳本

cat sed.rule
s/first/FIRST/
s/second/SECOND/
sed -f sed.rule csophys
I am the FIRST line!
line SECOND is me.

更多命令能夠參考 man sed。 shell

2 awk

awk '{pattern + action}' {filenames}

awk是在每行處理文本的時候,默認按照空格隔離每個域,對每個域作處理。也能夠直接經過在awk 後加 -F. 指定分隔符。 數組

 ls -l | awk '/rw/{print "第三列:"$3"\t|\t""第5列:"$5}'

第三列:csophys | 第5列:3154
第三列:csophys | 第5列:42
第三列:csophys | 第5列:5253
第三列:csophys | 第5列:32
第三列:csophys | 第5列:35
ls -l | awk 'BEGIN{OFS="&";count=10;for(i=0;i<3;i++)print"開始"}/rw/{print ++count,NR,$3,$5}END{print "結束"}'
開始
開始
開始
11&2&csophys&23
12&3&csophys&3675
13&4&csophys&42
14&5&csophys&5253
15&6&csophys&32
16&7&csophys&35
結束

awk中可使用printf來格式化輸出,也可使用if判斷語句 bash

ls -l | awk 'BEGIN{OFS="&";count=10;for(i=0;i<3;i++)print"開始"}/rw/{if(NR>3) printf("printf:%s,%s,%s,%s\n",++count,NR,$3,$5)}END{print "結束"}'
<i++)print"開始"}/rw/{if(NR>3) printf("printf:%s,%s,%s,%s\n",++count,NR,$3,$5)}END{print "結束"}'
開始
開始
開始
printf:11,4,csophys,42
printf:12,5,csophys,5253
printf:13,6,csophys,32
printf:14,7,csophys,35
結束

awk 內部變量名的含義以下: ide

變量名    含義 
ARGC   命令行變元個數 
ARGV   命令行變元數組 
FILENAME   當前輸入文件名 
FNR   當前文件中的記錄號 
FS   輸入域分隔符,默認爲一個空格 
RS   輸入記錄分隔符 
NF   當前記錄裏域個數 
NR   到目前爲止記錄數 
OFS   輸出域分隔符 
ORS   輸出記錄分隔符

更增強大的功能參考 man awk。 或者參考博客: post

  1. http://www.zsythink.net/archives/tag/awk/
  2. https://www.tutorialspoint.com/awk/awk_quick_guide.htm

3 sort

sort [-ntkr] 文件名 #-n 採用數字排序 #-t 指定分隔符 #-k 指定第幾列 #-r 反向排序 測試

ls -l | awk '/rw/{print $5}' | sort -n -r
5253
1608
42
35
32
ls -l | sort -k 5 -n -r
-rw-r--r--  1 csophys  staff  5253  9  3 11:25 passwd
-rw-r--r--  1 csophys  staff  1817  9  3 22:29 command.org
-rw-r--r--  1 csophys  staff    42  9  1 23:14 csophys
-rw-r--r--  1 csophys  staff    35  9  3 11:37 test
-rw-r--r--  1 csophys  staff    32  9  2 22:59 sed.rule
total 48
ls -l | sort -k 2 -t ":"
total 48
-rw-r--r--  1 csophys  staff    42  9  1 23:14 csophys
-rw-r--r--  1 csophys  staff  5253  9  3 11:25 passwd
-rw-r--r--  1 csophys  staff  2157  9  3 22:31 command.org
-rw-r--r--  1 csophys  staff    35  9  3 11:37 test
-rw-r--r--  1 csophys  staff    32  9  2 22:59 sed.rule

4 uniq

uniq通常須要和sort配合使用。uniq 的做業是刪除連續相同的行,因此在sort以後使用效果很好。-c 參數能夠打印出重複的次數。

ls -l | awk '/rw/{print $3}' 
csophys
csophys
csophys
csophys
csophys

ls -l | awk '/rw/{print $3}' | uniq -c
5 csophys

5 其餘

  1. cut。cut能夠截取指定分隔符隔開後的具體某一列或者某幾列。
  2. tr。tr命令主要做用是在於文本轉換或者刪除
  3. paste。paste做用是在於按照指定的分隔符按照行進行合併
  4. split。使用split能夠實現文件的分割,支持按照行數分割和按照大小分割兩種模式。

Author: 陳勝

Created: 2017-09-04 Mon 23:16

Validate

相關文章
相關標籤/搜索