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 行。模式空间是一堆空格,然后是“3 user”。为了匹配这一点,我们搜索空白零次或多次,然后多次搜索数字,即一个数字(在我看来应该是+而不是*),存储在寄存器\1中,然后空格(*是我认为不需要),然后任何字符多次(再次+会更好)存储在寄存器 \2 中。所以现在,出现在 \1 中,字符串/用户在 \2 中。

"\2": \1,

整行被匹配并且片段被存储,现在我们用引号替换匹配的内容,然后是用户,然后是引号,冒号,空格,出现和逗号。

$a}

$也是一个行地址。如果当前行是最后一行(目前不是),请调用该a命令将“}”附加到单独一行的标准输出中。

这行代码处理结束,操作完成后自动打印模式空间,然后读取第二行的内容,重复整个循环。

输出示例:

{
"user": 3,
}

这基本上是一种 JSON 文件格式,尽管缩进不正确。

就是这样。抱歉写小说了:)

相关内容