Linux 我有一个日志文件,需要在其中获得指定的输出,并且需要在shell脚本中编写逻辑
下面是日志文件和预期输出。文件输出应该具有他们下载的CustomerName和大小。有一个客户名称:John下载了两次,因此在最终输出中,我需要获得他下载的总大小。我需要帮助写一个shell脚本 多谢各位Linux 我有一个日志文件,需要在其中获得指定的输出,并且需要在shell脚本中编写逻辑,linux,bash,shell,unix,awk,Linux,Bash,Shell,Unix,Awk,下面是日志文件和预期输出。文件输出应该具有他们下载的CustomerName和大小。有一个客户名称:John下载了两次,因此在最终输出中,我需要获得他下载的总大小。我需要帮助写一个shell脚本 多谢各位 01-01-2012 01:13:36 Blah blah : blah CustomerName:Sam downloaded Blah Size:5432 bytes Carrier:Company-A 01-01-2012 01:13:45 Blah blah : blah Custo
01-01-2012 01:13:36 Blah blah : blah CustomerName:Sam downloaded Blah Size:5432 bytes Carrier:Company-A
01-01-2012 01:13:45 Blah blah : blah CustomerName:John downloaded Blah Size:38655 bytes Carrier:Company-S
01-01-2012 01:13:47 Blah blah : blah CustomerName:Dave downloaded Blah Size:25632 bytes Carrier:Company-A
01-01-2012 01:13:50 Blah blah : blah CustomerName:John downloaded Blah Size:7213 bytes Carrier:Company-S
01-01-2012 01:13:58 Blah blah : blah CustomerName:Kristy downloaded Blah Size:70100 bytes Carrier:Company-V
预期产量
CustomerName: Sam Size: 5432
CustomerName: John Size: 45868
CustomerName: Dave Size: 25632
CustomerName: Kristy Size: 70100
其中,xxx.txt
是输入文件
关于
awk'{arr[$1]+=$2}END{for(i in-arr){print i,arr[i]}'
的解释:
{arr[$1]+=$2}
将创建一个映射
,该映射以名称为键,以数字为值,如果特定键存在,则将数字添加到值中,并且awk
处理完所有行后将执行END
块,在这种情况下,该块将打印映射
试试这个-
awk -F '[ :]' '{name[$11]++ ; size[$11]+=$15} END \
{for (i in name) print "CustomerName: ", i, "Size:" size[i]}' test
其中,test
是输入文件的名称
输出-
CustomerName: Dave Size:25632
CustomerName: John Size:45868
CustomerName: Sam Size:5432
CustomerName: Kristy Size:70100
解释-
-F'[:]
将分隔符设置为空格
和:
。因此列的编号不同
我定义了两个数组。数组name
包含不同人员的姓名。
数组size
具有基于人名的键,但包含下载的大小
在结束
之后的部分中,我将迭代名称
数组中的名称,并简单地获取名称和大小的值。根据您的问题,我还在打印部分添加了一些文本
cat InputFile |awk -F'blah' '{print $3}'|awk -F'downloaded Blah' '{print $1 $2}'|awk -F'bytes' '{print $1}'|awk '{print $1" "$2}'|sed 's/:/\ :\ /g'
或
两者都是相同的东西,就在一个是以单行格式编写的,第二个是可以作为脚本保存的,以后可以修改,更好地理解
在awk中,-F
是用于剪切字符串的分隔符,这使得它更容易理解和获得输出。正如您提到的,您需要在:
之前和之后使用空格,我使用了sed。两者都将产生如下输出:
CustomerName : Sam Size : 5432
CustomerName : John Size : 38655
CustomerName : Dave Size : 25632
CustomerName : John Size : 7213
CustomerName : Kristy Size : 70100
使用gsub
从$10
中删除非数字:
$ awk '
{
gsub(/[^0-9]/,"",$10) # remove non-digits
a[$7]+=$10 # count the sizes grouping on the name
}
END { # in the end
for(i in a)
print i, "Size:" a[i] # output
}' file
CustomerName:John Size:45868
CustomerName:Sam Size:5432
CustomerName:Kristy Size:70100
CustomerName:Dave Size:25632
这不是为你工作的服务。您需要先发布您尝试过的内容。我使用akw来分离列CustomerName和Size,然后将输出重定向到新的脚本文件。通过删除日志文件中的重复项(例如:CustomerName:John),我无法理解将名称和大小添加到数组中的逻辑。您需要发布一些代码。awk'{print$7,$10}'question1.txt>idea.sh我已将日志保存在.txt中,并将列分隔开来,并将它们重定向到idea.sh。我是编程/脚本新手,我刚刚开始学习shell脚本。请将其编辑到您的问题中。评论并不总是停留在你周围。你能解释一下你在第二个管道之后做了什么吗?这不是OP要求的输出格式。而且你正在呼叫awk
三次。没有必要。查看我的解决方案。您不需要执行cat xyz | awk
awk
能够读取自己的输入。看看这个-你不需要cat | awk | awk | awk | awk | sed
!看看我的答案。
CustomerName : Sam Size : 5432
CustomerName : John Size : 38655
CustomerName : Dave Size : 25632
CustomerName : John Size : 7213
CustomerName : Kristy Size : 70100
$ awk '
{
gsub(/[^0-9]/,"",$10) # remove non-digits
a[$7]+=$10 # count the sizes grouping on the name
}
END { # in the end
for(i in a)
print i, "Size:" a[i] # output
}' file
CustomerName:John Size:45868
CustomerName:Sam Size:5432
CustomerName:Kristy Size:70100
CustomerName:Dave Size:25632