幾個文本處理工具的簡單使用(wc,cut,sort,uniq,diff和patch)

来源:https://www.cnblogs.com/alongdidi/archive/2019/02/21/10408025.html
-Advertisement-
Play Games

wc wc命令用於報告文本文件的一些統計計數,例如行數、單詞數、位元組數等。 語法如下。 --files0-from=F:這個選項幾乎沒見過有人使用,我也看不懂,因此就忽略掉了。 預設情況下顯示3個計數,從左往右分別是行數、單詞數和位元組數。 如果被統計的文件數大於1,那麼還會顯示一行總計。 可以通過選 ...


wc

wc命令用於報告文本文件的一些統計計數,例如行數、單詞數、位元組數等。

語法如下。

wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F

--files0-from=F:這個選項幾乎沒見過有人使用,我也看不懂,因此就忽略掉了。

預設情況下顯示3個計數,從左往右分別是行數、單詞數和位元組數。

[root@C7 ~]# wc /etc/passwd
  51   94 2599 /etc/passwd

如果被統計的文件數大於1,那麼還會顯示一行總計。

[root@C7 ~]# wc /etc/passwd /etc/init.d/functions 
   51    94  2599 /etc/passwd
  707  2364 18104 /etc/init.d/functions
  758  2458 20703 total

可以通過選項控制,單獨顯示這3個計數。

-l, --lines:顯示行數。

[root@C7 ~]# wc -l /etc/passwd
51 /etc/passwd

-w, --words:顯示單詞數。

[root@C7 ~]# wc -w /etc/passwd
94 /etc/passwd

-c, --bytes:顯示位元組數。

[root@C7 ~]# wc -c /etc/passwd
2599 /etc/passwd

還可以顯示一些另外的計數。

-m, --chars:顯示字元數。

[root@C7 ~]# wc -m /etc/passwd
2599 /etc/passwd

-L, --max-line-length:顯示文件中最長的行的長度。

[root@C7 ~]# wc -L /etc/passwd
99 /etc/passwd

 

cut

從一個文本文件中,截取我們所需要的部分進行顯示,一般是用於有固定的分隔符的文本文件,例如/etc/passwd這種以“:”作為分隔符的文件。

cut的預設分隔符是TAB。

語法如下。

cut OPTION... [FILE]...

我們創建一個測試文件cut.txt,第一行以TAB分隔,第二行以一個空格分隔,第三行分別以一個空格、兩個空格和三個空格分隔。

[root@C7 ~]# cat -A cut.txt
a^Ilong^Idi^Idi$
a long di di$
a long  di   di$

在“cat -A”的輸出中,“^I”表示TAB,“$”表示換行符。

-f, --fields=LIST:指定要截取每一行中第幾個欄位的數據。

這裡的LIST,可以是單獨的某個欄位,也可以是連續的欄位範圍,也可以是離散的欄位,如下所示。

# cut -f 2 FILE
# cut -f 2,3,4 FILE
# cut -f 2-5 FILE
# cut -f 1,2-3,5 FILE
# cut -f 2- FILE:從第2個欄位到行尾。
# cut -f -2 FILE:從行首到第2個欄位。

LIST也可用於後面的-b和-c選項。

然後我們嘗試對cut.txt取第二個欄位。

[root@C7 ~]# cut -f 2 cut.txt 
long
a long di di
a long  di   di

我們發現,第一行以TAB為分隔符的行取出的欄位是正確的,另外2個欄位是整行都取出來了。

這是因為預設情況下不包含分隔符的行會被整行列印,如果想避免這種情況可以使用-s選項。

-s, --only-delimited:只列印那些包含分隔符的行。

[root@C7 ~]# cut -sf 2 cut.txt 
long

這裡有一點需要註意,使用短選項的時候,-f後面必須跟著數字,如果跟其他選項就會報錯。

[root@C7 ~]# cut -fs 2 cut.txt 
cut: invalid byte, character or field list

-d, --delimiter=DELIM:指定分隔符,而不使用預設的TAB,這個選項很有用,許多文件的預設分隔符都不是TAB。

[root@C7 ~]# head -n 3 /etc/passwd | cut -d : -f 7
/bin/bash
/sbin/nologin
/sbin/nologin

-b, --bytes=LIST:只取多少個位元組數的數據。

-c, --characters=LIST:只取多少個字元數的數據。

當取的數據是數字和字母的時候,這兩個選項的結果一般是相同的。

[root@C7 ~]# echo "alongdidi" | cut -b 1-4
alon
[root@C7 ~]# echo "alongdidi" | cut -c 1-4
alon

--output-delimiter=STRING:設置輸出時候的分隔符,預設是採用和輸入文件相同的分隔符。

[root@C7 ~]# grep -E "^(root|zwl)" /etc/passwd | cut -d : -f 1,7
root:/bin/bash
zwl:/bin/bash
[root@C7 ~]# grep -E "^(root|zwl)" /etc/passwd | cut -d : -f 1,7 --output-delimiter "'s shell ="
root's shell =/bin/bash
zwl's shell =/bin/bash

 

sort

sort用於將文件排序後顯示。

語法如下。

sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F

sort的排序可以針對多個文件,一起排序後顯示。

[root@C7 ~]# cat sort1.txt 
aaa
ccc
bbb
[root@C7 ~]# cat sort2.txt 
eee
fff
ddd
[root@C7 ~]# sort sort1.txt 
aaa
bbb
ccc
[root@C7 ~]# sort sort1.txt sort2.txt 
aaa
bbb
ccc
ddd
eee
fff

sort的預設排序方式,是先比較第一個字元,如果一樣,則再比較第二個字元。以此類推。

數字的排序方式是0~9,字母的排序方式是a~z。

如果字母相同只是大小寫不同的話,那麼小寫排在大寫的前面,例如a排在A的前面。

[root@C7 ~]# cat sort.txt
aaa
DDD
fff
AAA
bbb
BBB
eee
CCC
999
876
333
[root@C7 ~]# sort sort.txt
333
876
999
aaa
AAA
bbb
BBB
CCC
DDD
eee
fff

-r, --reverse:sort預設是有小到大排序,該選項則用於反向排序。

[root@C7 ~]# sort sort.txt
111
222
555
888
[root@C7 ~]# sort -r sort.txt
888
555
222
111

-n, --numeric-sort:基於數值排序。由於sort預設的排序機制導致sort沒辦法將數字按照數值大小準確排序,需要加上該選項方可實現。

[root@C7 ~]# sort sort.txt
1790
180
19
[root@C7 ~]# sort -n sort.txt
19
180
1790

-t, --field-separator=SEP:指定欄位分隔符。

-k, --key=KEYDEF:指定排序依據的欄位。

二者結合可以使得sort在排序某個文件的時候根據每行固定的欄位來排序。例如根據UID排序/etc/passwd。

[root@C7 ~]# head -n 5 /etc/passwd | sort -t : -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

-f, --ignore-case:忽略大小寫排序,原理是sort內部會將小寫字母轉換成大寫字母來排序。

-u, --unique:使得重覆的行只出現一次,結合-f選項的話,只會保留一種大寫/小寫的情況。

[root@C7 ~]# sort sort.txt
aaa
aaa
AAA
bbb
bbb
BBB
ddd
jjj
ooo
[root@C7 ~]# sort -uf sort.txt
aaa
BBB
ddd
jjj
ooo

 

uniq

uniq用於報告或者忽略掉重覆的行。但是只會將相鄰的重覆行移除掉,而不是將整個文本中重覆的行移除掉。

[root@C7 ~]# cut -d : -f 7 /etc/passwd
/bin/bash
/sbin/nologin
-- 多個重覆 --
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
-- 多個重覆 --
/sbin/nologin
/bin/bash
-- 多個重覆 --
/bin/bash
/sbin/nologin
[root@C7 ~]# cut -d : -f 7 /etc/passwd | uniq
/bin/bash
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/bin/bash
/sbin/nologin

這可能不是我們所要的結果,一般我們會先使用sort排序一下,再使用uniq移除相鄰的重覆行。這樣子就可以實現刪除文本中重覆的行的功能。

[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown

-c, --count:uniq區別於“sort -u”的主要一點在於它還可以統計重覆的行所出現的次數。

[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq -c
      9 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     39 /sbin/nologin
      1 /sbin/shutdown

-d, --repeated:只顯示有重覆的行。

[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq -cd
      9 /bin/bash
     39 /sbin/nologin

-u, --unique:也可以只列印不重覆的行。

[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq -u
/bin/sync
/sbin/halt
/sbin/shutdown

 

diff和patch

diff用於對比兩個文本文件的區別,對比的結果本質上是一個補丁文件,可以讓patch用來對文件打補丁。

首先我們先看兩個文本文件的內容。

[root@C7 ~]# cat -n old_file.txt 
     1    today
     2    is
     3    thursday
     4    !!!
[root@C7 ~]# cat -n new_file.txt 
     1    today
     2    is
     3    not
     4    thursday
     5    !?!?

接下來看diff的預設比對結果。

[root@C7 ~]# diff old_file.txt new_file.txt 
2a3
> not
4c5
< !!!
---
> !?!?

這個結果其實就是描述了被對比的兩個文件之間的區別,只不過這個描述我們人類比較難以理解,將這個描述重定向至文本文件,那麼該文件就成為一個補丁文件了。

[root@C7 ~]# diff old_file.txt new_file.txt > patch.txt

當我們擁有old_file.txt和補丁文件patch.txt的時候,我們就可以通過patch命令打補丁將old_file.txt變成(“升級”)new_file.txt。

[root@C7 ~]# patch -i patch.txt old_file.txt 
patching file old_file.txt
[root@C7 ~]# cat old_file.txt 
today
is
not
thursday
!?!?

如果想使得old_file.txt變回打補丁前的樣子,可以在使用patch命令的時候,加上-R選項,打反向補丁。

[root@C7 ~]# patch -Ri patch.txt old_file.txt 
patching file old_file.txt
[root@C7 ~]# cat old_file.txt 
today
is
thursday
!!!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Windows Server平臺因業務需求經常會用到NIC雙網卡綁定,同樣Linux平臺下用於網路負載均衡及網路冗餘會用到bond模式。Bond模式:0-6,即7種模式。模式一:mod=0 ,即:(balance-rr) Round-robin policy(平衡輪循策略)特點:傳輸數據包順序是依... ...
  • 顯示前3行數據 ls -l|head -n 3 顯示後3行數據 ls -l|tail -n 3 ...
  • 在我們日常工作中或者日常針對AD進行自動化開發的過程中,我們都會對UserPrincipalName與SamAccountName產生疑惑,畢竟很多時候大家都把這兩個屬性值理解為同一個概念,至於為什麼總是說不清楚,今天就簡單歸總下該內容。UserPrincipalName:指定要由客戶端進行身份驗證... ...
  • Linux 中一切皆為文件,文件類型也有多種,使用 ls -l 命令可以查看文件的屬性,所顯示結果的第一列的第一個字元用來表明該文件的文件類型,如下: 1、普通文件 使用 ls -l 命令後,第一列第一個字元為 "-" 的文件為普通文件,如上圖所示,普通文件一般為灰色字體,綠色字體的是可執行文件,紅 ...
  • 前邊我們介紹到Windows Server 2016-圖形化新建域用戶(一) 及 Windows Server 2016-批量新建域用戶(二) ,裡邊提到了批量通過new-aduser常見帳號,這裡簡單的對前章節內容做個補充,具體信息如下: 命令語法: 常用欄位註解: 例:創建wen帳號: ...
  • 今天在linux里修改腳本文件時,不小心非正常關閉了腳本文件,再次編輯時,每次都提示 如下錯誤: E325: 註意發現交換文件 ".bqh.sh.swp" 所有者: root 日期: Wed Feb 20 03:51:12 2019 文件名: /server/scripts/bqh.sh 修改過: ...
  • 1、curl -X POST “http://XXXXXXX”這種請求方式參數直接寫在URL裡面的,而不是body ...
  • 本周,運維告知部署的服務被掃描發現漏洞,涉及的軟體分別為 ,`ZooKeeper Elasticsearch`. 因為最近任務繁重,人力資源緊張,因此無法抽出更多時間調整代碼,添加許可權認證. 與軟體部署人員確認,上述三個軟體均為內網訪問,因此採用以下方式進行處理: (1) 設置訪問 地址,即僅允許同 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...