顯示具有 grep 標籤的文章。 顯示所有文章
顯示具有 grep 標籤的文章。 顯示所有文章

2022年3月24日 星期四

如何利用多核CPU來加速你的Linux命令

  你是否曾經有過要計算一個非常大的資料(幾百GB)的需求?或在裡面搜尋,或其它操作——一些無法並行的操作。資料專家們,我是在對你們說。你可能有一個4核或更多核的CPU,但我們合適的工具,例如 grep, bzip2, wc, awk, sed等等,都是單執行緒的,只能使用一個CPU核心。

  借用卡通人物Cartman的話,“如何我能使用這些核心”?

  要想讓Linux命令使用所有的CPU核心,我們需要用到GNU Parallel命令,它讓我們所有的CPU核心在單機內做神奇的map-reduce操作,當然,這還要藉助很少用到的–pipes 引數(也叫做–spreadstdin)。這樣,你的負載就會平均分配到各CPU上,真的。

  BZIP2

  bzip2是比gzip更好的壓縮工具,但它很慢!別折騰了,我們有辦法解決這問題。

  以前的做法:

cat bigfile.bin | bzip2 --best > compressedfile.bz2

  現在這樣:

cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2

  尤其是針對bzip2,GNU parallel在多核CPU上是超級的快。你一不留神,它就執行完成了。

  GREP

  如果你有一個非常大的文字檔案,以前你可能會這樣:

grep pattern bigfile.txt

 現在你可以這樣:

cat bigfile.txt | parallel  --pipe grep 'pattern'

  或者這樣:

cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'

  這第二種用法使用了 –block 10M引數,這是說每個核心處理1千萬行——你可以用這個引數來調整每個CUP核心處理多少行資料。

  AWK

  下面是一個用awk命令計算一個非常大的資料檔案的例子。

  常規用法:

cat rands20M.txt | awk '{s+=$1} END {print s}'

  現在這樣:

cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'

  這個有點複雜:parallel命令中的–pipe引數將cat輸出分成多個塊分派給awk呼叫,形成了很多子計算操作。這些子計算經過第二個管道進入了同一個awk命令,從而輸出最終結果。第一個awk有三個反斜槓,這是GNU parallel呼叫awk的需要。

  WC

  想要最快的速度計算一個檔案的行數嗎?

  傳統做法:

wc -l bigfile.txt

  現在你應該這樣:

cat bigfile.txt | parallel  --pipe wc -l | awk '{s+=$1} END {print s}'

  非常的巧妙,先使用parallel命令‘mapping’出大量的wc -l呼叫,形成子計算,最後通過管道傳送給awk進行彙總。

  SED

  想在一個巨大的檔案裡使用sed命令做大量的替換操作嗎?

  常規做法:

sed s^old^new^g bigfile.txt

  現在你可以:

cat bigfile.txt | parallel --pipe sed s^old^new^g

  …然後你可以使用管道把輸出儲存到指定的檔案裡。

  英文原文:Use multiple CPU Cores with your Linux commands 

資料來源:https://iter01.com/34786.html

2022年3月2日 星期三

windows上等同 cat 及 grep 的指令

 linux 的 cat 及 grep 指令在查找紀錄檔時相當好用,windows系統上也有類似的指令,分別是 type、find 及 findstr,指令的詳細用法可以用 help command 取得說明


顯示檔案內容
cmd> type _vimrc
 set nocompatible
 behave mswin
 set nobackup
 set tabstop=4
 colorscheme koehler

搜尋輸出的資訊,例如查找系統在監聽的通訊埠
cmd> netstat -an | find "LISTEN"
  TCP    0.0.0.0:135             0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445             0.0.0.0:0              LISTENING
  TCP    0.0.0.0:4000           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING

那兩個指令的結合就是等同 cat 及 grep
cmd> type file | find "pattern"

type file |findstr /C:"pattern1" /C:"pattern2"

2021年2月18日 星期四

Linux 匹配文字 grep 指令用法教學與範例

本篇介紹如何使用 Linux 的 grep 指令,根據關鍵字或正規表示法找出想要的資料。

Linux 的 grep 是一個很好用的指令,可以從串流資料或檔案中,使用關鍵字或正規表示法(regular expression)篩選出想要尋找的資料,並且顯示出來,以下是 grep 的用法教學以及實際範例。

grep 這個指令名稱其實是來自於正規表示法的 g/RE/p,其意義是代表以正規表示法全域搜尋並列印出來(globally search for RE and print it)。

搜尋關鍵字

grep 最基本的用法就是以普通的關鍵字來搜尋,其基本語法如下:

grep 關鍵字 檔案1 檔案2 ...

例如在 /etc/os-release 檔案中搜尋 Ubuntu 關鍵字:

grep Ubuntu /etc/os-release
NAME="Ubuntu"
PRETTY_NAME="Ubuntu 18.04.3 LTS"

執行的結果會列出所有含有關鍵字的整行文字。

grep 亦可搭配萬用字元(*)同時搜尋多個檔案,例如在 /etc/ 目錄之下所有 *.conf 檔案中,尋找 network 這個字眼:

grep network /etc/*.conf
ltrace.conf:hex(uint) inet_network(string);
nsswitch.conf:networks:       files
sysctl.conf:# Additional settings - these settings can improve the network
sysctl.conf:# security of the host and prevent against some network attacks
sysctl.conf:# redirection. Some network environments, however, require that these

搜尋多個檔案時,在輸出中會標示資料來源是哪一個檔案。

除了搜尋檔案內容之外,亦可搭配管線(pipe)篩選串流資料,例如篩選出含有 network 關鍵字的檔案名稱:

ls /etc/ | grep network
network
networkd-dispatcher
networks

不分大小寫

grep 預設會區分字母的大小寫,如果希望以不分大小寫的方式搜尋,可以加上 -i 參數:

grep -i Ubuntu /etc/os-release

標示行號

若要標示匹配文字的行號,可以加上 -n 參數:

grep -n Ubuntu /etc/os-release
1:NAME="Ubuntu"
5:PRETTY_NAME="Ubuntu 18.04.3 LTS"

反向匹配

若想要將匹配的資料排除,只顯示出沒有關鍵字的那幾行資料,可以加上 -v 參數。例如顯示不包含 Ubuntu 關鍵字的那幾行:

grep -v Ubuntu /etc/os-release

遞迴搜尋檔案

如果想要在指定目錄與其子目錄下所有的檔案中,搜尋指定的關鍵字,可以加上 -r 參數:

grep -r ubuntu /etc/

如果只想要從特定的檔案中尋找關鍵字,可以使用 -r 搭配 --include 指定檔案類型:

grep -r --include="*.conf" ubuntu /etc/

如果自己的權限沒辦法讀取所有的檔案,就會出現某些檔案無法讀取的錯誤訊息,這時候可以將這種錯誤訊息導向 /dev/null,只看正常訊息就好:

grep -r ubuntu /etc/ 2>/dev/null

顯示前後幾行

有時候只顯示匹配成功那一行,不容易看出是否是我們想要找的資料,這時候可以加上 -A(After)、-B(Before)或-C(Context),指定要顯示的前後行數:

grep -A 1 Ubuntu /etc/os-release


grep -B 1 Ubuntu /etc/os-release


grep -C 1 Ubuntu /etc/os-release

顏色標示

grep 可以使用顏色標示的方式,將成功匹配的部分文字標示出來,方便使用者閱讀。顏色標示功能可以透過 --color=never、--color=always、--color=auto 這幾種參數來關閉、開啟或設為自動。開啟顏色標示的輸出會像這樣:

grep 顏色標示

grep 顏色標示

正規表示法

grep 在搜尋關鍵字時,其實是以正規表示法的方式匹配文字的,所以一般的正規表示法都可以直接使用,以下是一些常用的範例。開頭與結尾是最常用的:

ls | grep "^a"


ls | grep "b$"


ls | grep "^[ab]"


ls | grep "[ab]$"

各種出現次數的指定:

ls | grep "^ab*"


ls | grep "^ab?"


ls | grep "^ab+"

多種字眼的組合,也很常用:

ls | grep "ab|cd"


ls | grep -E "ab|cd"

如果只想要精準篩選出 net 這個單字,可以這樣寫:

ls | grep "<net>"
issue.net

這樣就只會出現含有 net 這一個單字的結果,像是 network 這樣的字眼就會被排除。

參考資料:鳥哥的 Linux 私房菜、Carlos-Studio、Linux 命令大全 

資料來源: https://blog.gtwang.org/linux/linux-grep-command-tutorial-examples/