我已經知道這個命令的各個部分的作用:
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 檔案格式,儘管縮排不正確。
就是這樣。抱歉寫小說了:)