我已经知道这个命令的各个部分的作用:
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 行。模式空间是一堆空格,然后是“3 user”。为了匹配这一点,我们搜索空白零次或多次,然后多次搜索数字,即一个数字(在我看来应该是+而不是*),存储在寄存器\1中,然后空格(*是我认为不需要),然后任何字符多次(再次+会更好)存储在寄存器 \2 中。所以现在,出现在 \1 中,字符串/用户在 \2 中。
"\2": \1,
整行被匹配并且片段被存储,现在我们用引号替换匹配的内容,然后是用户,然后是引号,冒号,空格,出现和逗号。
$a}
$
也是一个行地址。如果当前行是最后一行(目前不是),请调用该a
命令将“}”附加到单独一行的标准输出中。
这行代码处理结束,操作完成后自动打印模式空间,然后读取第二行的内容,重复整个循环。
输出示例:
{
"user": 3,
}
这基本上是一种 JSON 文件格式,尽管缩进不正确。
就是这样。抱歉写小说了:)