0

早些时候我使用这个命令生成以空格分隔格式的记录

sudo cat path of the file |
awk -v d="$(date --date="1 days ago" +"%h %e")" ' 
    /Accepted/ && ($0 ~ d) { print $1,$2,$9,$11}' |
sort | uniq -c

像这样

xx xx xx xxxx xxx
xx xx xx xxxx xxx

现在我的目标是为我使用这种方式生成一个逗号分隔的记录

sudo cat path of the file |
awk -v d="$(date --date="1 days ago" +"%h %e")" ' 
    /Accepted/ && ($0 ~ d) { print $1","$2","$9","$11}' |
sort | uniq -c

但它给了我这样的记录

xx xx,xx,xxxx,xxx
xx xx,xx,xxxx,xxx

我想在第一列之后实现逗号,依此类推。请问我有什么帮助

4

3 回答 3

0

我建议使用“sed”并将空格替换为 ,。这是执行此操作的简单回声语句

[user@hostname ~]$ echo "xx xx xx xxxx xxx" | sed 's/ /,/g'
xx,xx,xx,xxxx,xxx

同样,您可以在最后使用另一个管道并执行 sed 之类的操作

sudo cat path of the file |
awk -v d="$(date --date="1 days ago" +"%h %e")" ' 
    /Accepted/ && ($0 ~ d) { print $1,$2,$9,$11}' |
sort | uniq -c | sed 's/ /,/g'
于 2021-03-04T07:30:12.260 回答
0

问题在于,uniq -c将计数作为行的前缀,用空格将计数与数据分开(并且通常在计数之前包含空格,至少对于 Mac 上最多 3 位数的计数,在 RHEL 7.4 上最多 6 位数)。因此,如果无法更改分隔符(Mac 上没有;而uniqRHEL 7.4 上的 8.22 不包含这样的选项),那么您将不得不自己做。

但是,您可以使用它awk来进行计数和格式化,为后处理留下一个可选的排序:

sudo cat /var/log/secure |
awk -v d="$(date --date="1 days ago" +"%h %e")" ' 
    /Accepted/ && ($0 ~ d) { key = $1 "," $2 "," $9 "," $11; count[key]++ }
    END { for (key in count) print count[key] ",", key }'

警告:未经测试的代码——问题中没有任何可用的示例数据!

于 2021-03-04T06:23:11.107 回答
0

如果有人有更好的方法,我已经使用了这个,然后告诉我

sudo cat path of the file |
awk -v d="$(date --date="1 days ago" +"%h %e")" ' 
    /Accepted/ && ($0 ~ d) { print $1,$2,$9,$11}' |  
sort | uniq -c | sed -E -e 's/^[[:blank:]]+//g' -e 's/[[:blank:]]+/,/g'
于 2021-03-04T05:20:39.097 回答