【问题标题】:Shell scripting - cut all the strings of a specific keyword in a fileShell 脚本 - 剪切文件中特定关键字的所有字符串
【发布时间】:2017-09-06 17:29:14
【问题描述】:

我正在尝试制作一个脚本,它接收一个日志文件,其中每一行由一个名称 + >tab

calloffice      14
name    15
other   16
CallOffice      18

我要做的是找到与给定名称匹配的所有行,然后将运行时编号相加。

所以我首先让他们打印出来。但是我的脚本应该能够在 logg 文件中搜索关键字并仅从该关键字获取所有不同的运行时,现在我从所有数字而不是关键字运行时获取运行时。

这是我到目前为止所做的:

#!/bin/bash
echo "What is the event?"

FILE=$1

while read text
do
    if grep "$text" hendelse.txt; then

    $text | cut -f2 -d$'\t' hendelse.txt

else 
    echo "text not found"
fi
done

我知道我什至还没有接近脚本的终点,但我的问题是如何从特定关键字中获取运行时编号?

【问题讨论】:

  • 更新您的问题以包括 a) 示例日志文件的内容,以及 b) 解释 numbers and combine them 的含义(例如,您想将 add 数字放在一起)并提供所需结果的示例(应用于示例日志文件内容时)
  • 你明白了,我想把它们加在一起,最后的结果是:CallOffice 14 + CallOffice 14 = "CallOffice 28"
  • 好的,所以把它添加到你的问题中(这样以后人们就不必通读这些 cmets 来拼凑完整的图片了);另外,fwiw,您已经接受了一个没有执行所需添加的答案
  • 我只是想要这个答案,但如果人们想添加一些输入,他们可以。但是谢谢你的笔记,我下次会考虑这个。
  • 你确实意识到你接受的答案并没有达到你想要的效果,对吧?如果您有 2 个带有 calloffice 的条目,则接受的答案不会将数字相加以提供总和/总计

标签: bash shell delimiter cut


【解决方案1】:

你应该使用 awk 和 tab 作为分隔符 (awk -F"\t")

假设您在一个文件中包含所有运行时和名称,并用制表符分隔。

你应该这样做(在这种情况下关键字是 calloffice):

~$ cat test.txt 
calloffice	14
name	15
other	16

~$ grep calloffice test.txt 
calloffice	14

~$ grep calloffice test.txt |awk -F"\t" '{print $2}'
14

您的结果是 14,这是给定关键字的运行时间。注意是调用第二个参数($2)的print的结果。

【讨论】:

  • 如果使用awk,则不需要grepawk -F'\t' '$1 == "calloffice" {print $2}' test.txt,或者将名称作为参数传递awk -F'\t' -v name="calloffice" '$1 == name {print $2}' test.txt
  • 是的,效果很好,非常感谢。我不明白“{print $2}”,但它有效!
  • awk 的工作原理是这样的,默认情况下它会使用空格分隔任何单词/行,例如使用 awk '{print $1, $3}' 的“this is an example”行将打印“this an",因为这些单词是由一个空格分隔的第一个和第三个单词。在这里查看更多thegeekstuff.com/2010/01/…
  • 哇,太棒了,所以现在我可以结合我给定的变量了,完美!
【解决方案2】:

根据原始问题和从 OP 的 cmets 中提取的点点滴滴:

  • 文件中可能有多个匹配行
  • 对于所有匹配的行,将运行时相加
  • 需要使用不区分大小写的字符串匹配

示例输入文件:

$ cat test.txt
calloffice      14
name    15
other   16
CallOffice      18

一种可能的awk 解决方案:

BEGIN {total=0}
tolower($1)==str {total+=$2}
END {printf "total : %s\n",total}
  • BEGIN {total=0} :初始化我们的总数
  • tolower($1)==str :小写字段#1(允许不区分大小写的匹配),如果等于我们的输入字符串str 然后...
  • total+=$2 :将我们的总数增加字段 #2 中的金额

当传入“calloffice”搜索字符串时,awk 脚本正在运行:

$ awk '
BEGIN {total=0}
tolower($1)==str {total+=$2}
END {printf "%s total : %s\n",str,total}
' str="calloffice" test.txt

calloffice total : 32

【讨论】:

  • 我得到的结果是 0?
  • awk ' BEGIN {total=0} tolower($1)==str {total+=$2} END {printf "%s total : %s\n",str,total} ' str=" $text" hendelse.txt
  • $text 的值是多少? hendelse.txt 中有什么内容;将您的答案添加到您的原始问题中,以便我们(社区)确切地知道您正在使用什么
  • 我不知道如何正确地做到这一点,但我正在努力。 $text 是我的“读者”的价值,正如您在原始帖子中看到的那样。而hendelse.txt 是我正在读取的文件,因为我没有实际的日志文件可供使用。
  • 不,我的意思是...echo $text 的输出是什么? cat hendelse.txt 的输出是什么?将这些输出添加到您的问题中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2011-04-14
  • 2015-06-08
  • 1970-01-01
  • 2013-06-01
  • 2013-05-02
  • 2021-01-08
相关资源
最近更新 更多