Bash 从子组中获取每个子组的匹配模式数
我正在尝试获取应用程序打印的日志数。不确定从何处开始,我首先存储所有节点:Bash 从子组中获取每个子组的匹配模式数,bash,awk,Bash,Awk,我正在尝试获取应用程序打印的日志数。不确定从何处开始,我首先存储所有节点: nodes=$(awk '!a[$4]++' file) for node in $nodes; do //what logic comes here I could not manage to understand done 例如: Jan 2 13:01:02 node1 app1: Some message I do not care2. Jan 2 13:01:02 node1 app2: S
nodes=$(awk '!a[$4]++' file)
for node in $nodes;
do
//what logic comes here I could not manage to understand
done
例如:
Jan 2 13:01:02 node1 app1: Some message I do not care2.
Jan 2 13:01:02 node1 app2: Some message I do not care13.
Jan 2 13:01:02 node1 app3: Some message I do not care9.
Jan 2 13:01:02 node1 app4: Some message I do not care4.
Jan 2 13:01:02 node2 app4: Some message I do not care11.
Jan 2 13:01:02 node1 app4: Some message I do not care8.
Jan 2 13:01:02 node1 app2: Some message I do not care10.
Jan 2 13:01:02 node2 app1: Some message I do not care5.
Jan 2 13:01:02 node1 app2: Some message I do not care3.
预期结果:
node1:
app1:1
app2:3
app3:1
app4:2
node2:
app1:1
app4:1
使用GNU awk实现真正的多维数组(假设应用程序名称和
:
)之间始终存在空格):
如果输出顺序是一个问题,那么请在您的问题中澄清您的要求,因为有多种方式可以对输出进行排序。使用GNU awk实现真正的多维数组(并且假设应用程序名称和
:
之间始终有空格):
如果输出顺序是一个问题,那么请在问题中澄清您的要求,因为有各种方法可以对输出进行排序。这里是一个排序输出版本的
gawk
:
awk '{a[$4][$5]++}
END{PROCINFO["sorted_in"] = "@ind_str_asc"
for (e in a) {
printf "%s:\n", e
for (x in a[e])
printf "\t%s %s\n", x, a[e][x]}}' file
node1:
app1: 1
app2: 3
app3: 1
app4: 2
node2:
app1: 1
app4: 1
以下是已排序的
gawk
输出版本:
awk '{a[$4][$5]++}
END{PROCINFO["sorted_in"] = "@ind_str_asc"
for (e in a) {
printf "%s:\n", e
for (x in a[e])
printf "\t%s %s\n", x, a[e][x]}}' file
node1:
app1: 1
app2: 3
app3: 1
app4: 2
node2:
app1: 1
app4: 1
分拣辅助awk
$ cat monk.txt
Jan 2 13:01:02 node1 app1: Some message I do not care2.
Jan 2 13:01:02 node1 app2: Some message I do not care13.
Jan 2 13:01:02 node1 app3: Some message I do not care9.
Jan 2 13:01:02 node1 app4: Some message I do not care4.
Jan 2 13:01:02 node2 app4: Some message I do not care11.
Jan 2 13:01:02 node1 app4: Some message I do not care8.
Jan 2 13:01:02 node1 app2: Some message I do not care10.
Jan 2 13:01:02 node2 app1: Some message I do not care5.
Jan 2 13:01:02 node1 app2: Some message I do not care3.
$ sort -k4 -k5 monk.txt | awk -F"[ :]" ' { c=$7;if(p!=c && NR>1){print p;for(i in a) print "\t" i,":",a[i];delete a }p=c;a[$9]++} END{ print p;for(i in a)print "\t" i,":",a[i]; } '
node1
app1 : 1
app2 : 3
app3 : 1
app4 : 2
node2
app1 : 1
app4 : 1
$
或将常用打印代码包装到函数中
$ cat test.awk
function f1()
{
print p;
for(i in a) print "\t" i,":",a[i];
delete a
}
{ c=$7; if(p!=c && NR>1) { f1() } p=c;a[$9]++ }
END{ f1() }
$ sort -k4 -k5 monk.txt | gawk -F"[ :]" -f test.awk
node1
app1 : 1
app2 : 3
app3 : 1
app4 : 2
node2
app1 : 1
app4 : 1
$
分拣辅助awk
$ cat monk.txt
Jan 2 13:01:02 node1 app1: Some message I do not care2.
Jan 2 13:01:02 node1 app2: Some message I do not care13.
Jan 2 13:01:02 node1 app3: Some message I do not care9.
Jan 2 13:01:02 node1 app4: Some message I do not care4.
Jan 2 13:01:02 node2 app4: Some message I do not care11.
Jan 2 13:01:02 node1 app4: Some message I do not care8.
Jan 2 13:01:02 node1 app2: Some message I do not care10.
Jan 2 13:01:02 node2 app1: Some message I do not care5.
Jan 2 13:01:02 node1 app2: Some message I do not care3.
$ sort -k4 -k5 monk.txt | awk -F"[ :]" ' { c=$7;if(p!=c && NR>1){print p;for(i in a) print "\t" i,":",a[i];delete a }p=c;a[$9]++} END{ print p;for(i in a)print "\t" i,":",a[i]; } '
node1
app1 : 1
app2 : 3
app3 : 1
app4 : 2
node2
app1 : 1
app4 : 1
$
或将常用打印代码包装到函数中
$ cat test.awk
function f1()
{
print p;
for(i in a) print "\t" i,":",a[i];
delete a
}
{ c=$7; if(p!=c && NR>1) { f1() } p=c;a[$9]++ }
END{ f1() }
$ sort -k4 -k5 monk.txt | gawk -F"[ :]" -f test.awk
node1
app1 : 1
app2 : 3
app3 : 1
app4 : 2
node2
app1 : 1
app4 : 1
$
app
名称和:
(例如app1:
vsapp1:
)之间有时真的有空格吗?或者这只是懒洋洋的打字?如果它是错误的,那么很明显,修复它。app
名称和:
(例如app1:
vsapp1:
)之间确实有时会有空格吗?或者这只是懒洋洋的打字吗?如果它是错误的,那么很明显,修复它。