grep 和 sed 指令的作用是什麼

grep 和 sed 指令的作用是什麼

我已經知道這個命令的各個部分的作用:

zgrep -v "org" /path/to/files/* | zgrep "FollowEvent" | zgrep -o 'login":"[^"]*"' | cut -d'"' -f3 | sort | uniq -c | sed '1i{
       s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}' > usernames_followevents.txt

一點一點:

1)zgrep用於grep(搜尋).json.gz文件

2)zgrep -v "org" /path/to/files/*表示在每個文件中尋找/path/to/files/*不包含"org".

3)|是管道;意思是“然後”

4)表示在第一個 zgrep 找到的結果中zgrep "FollowEvent"找出字串。"FollowEvent"

5)|是管道;意思是“然後”

6)zgrep -o 'login":"[^"]*"'表示查找字串login":"以及條目中單字「login」之後的所有文字的非空匹配項。

7)| cut -d'"' -f3表示“然後僅從結果匹配中獲取第三個欄位”,在本例中為使用者名稱。

8)| sort | uniq -c表示「然後對使用者名稱進行排序,然後計算每個使用者名稱的唯一實例的數量」。

到目前為止,我們已經:

zgrep -v "org" /path/to/files/* | zgrep "FollowEvent" | zgrep -o 'login":"[^"]*"' | cut -d'"' -f3 | sort | uniq -c

它在/path/to/files/* 中的所有文件中不包含字符串“org”但包含字符串“FollowEvent”的所有條目中查找所有用戶名(這是“後面的第三個字段中的文本”)登入」),然後對這些使用者名稱進行排序併計算每個使用者名稱出現的次數。

我的問題是這部分:

sed '1i{ s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/;$a}'

我知道(或認為我知道)這麼多:

1)sed是一個允許操作文字的流編輯器。

2)sed '1i{表示“在前一行插入{”

3) 總之,此命令傳回{"username":count of that username}所有文件中的所有用戶名,如前所述。然後它將它們放入一個名為usernames_followevents.txt.

4) 該部分的"\2":意思是「在使用者名稱周圍加上雙引號,即第二個欄位 (?),然後插入 :」。

我想操作該sed命令,但在不了解其餘細節的情況下,我無法開始進行修改。

誰能解釋一下sed命令的每個部分的作用嗎?

答案1

現在sed命令的寫法是不正確的。它應該是這樣的腳本:

1i{
s/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/
$a}

或像這樣在一行中:

sed -e '1i{' -e 's/\s*\([0-9]*\)\s*\(.*\)/"\2": \1,/' -e '$a}'

從字面上看,您在命令之後i以及a直到換行符或表達式結尾(使用 -e)之前放置的所有內容都會直接列印在標準輸出上。

至於它的作用,我們來分解一下:

1i{

1是一個行地址。它告訴 sed 何時執行命令。當第一行的內容讀入模式空間(沒有尾隨換行符號)時,它i會在標準輸出的單獨行上插入「{」。請注意,模式空間沒有改變,它沒有添加“{”。

s是搜尋和取代指令,是 sed 中最通用的指令。\s匹配一個空格。\(regex\)像數學一樣將其中的正規表示式分組,但也會根據該組的順序將其匹配的內容儲存在數字暫存器中:\1 到 \9。

的輸出uniq -c是這樣的:

    occurrences string
    3 user

現在是複雜的部分:

\s*\([0-9]*\)\s*\(.*\)

仍然在第 1 行。為了匹配這一點,我們搜索空白零次或多次,然後多次搜索數字,即一個數字(在我看來應該是+而不是*),存儲在寄存器\1中,然後空格(*是我認為不需要),然後任何字元多次(再次+會更好)儲存在暫存器\2 中。所以現在,出現在 \1 中,字串/使用者在 \2 中。

"\2": \1,

整行被匹配並且片段被存儲,現在我們用引號替換匹配的內容,然後是用戶,然後是引號,冒號,空格,出現和逗號。

$a}

$也是一個行地址。如果目前行是最後一行(目前不是),請呼叫該a指令將「}」附加到單獨一行的標準輸出。

這行程式碼處理結束,操作完成後自動列印模式空間,然後讀取第二行的內容,重複整個循環。

輸出範例:

{
"user": 3,
}

這基本上是一種 JSON 檔案格式,儘管縮排不正確。

就是這樣。抱歉寫小說了:)

相關內容