Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我有一个日志文件,需要在其中获得指定的输出,并且需要在shell脚本中编写逻辑_Linux_Bash_Shell_Unix_Awk - Fatal编程技术网

Linux 我有一个日志文件,需要在其中获得指定的输出,并且需要在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

下面是日志文件和预期输出。文件输出应该具有他们下载的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 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