【问题标题】:Deleting User specific information from log file从日志文件中删除用户特定信息
【发布时间】:2020-07-31 20:35:15
【问题描述】:

我必须从所有日志文件中删除用户特定信息,即用户名、电子邮件和电话号码。

但是,对于每个日志文件,这些信息可以位于不同的列中;此外,日志文件没有任何特定格式。

例如一个日志文件是这样的:

CustomerID City     Cname   CPhone   Cemailid
1234       SEA  George 4468689901 goerge@xyz.com
2234       NYK  Jose   7712393223 jose@abc.com

而另一个是这样的:

Customername CustID email         Phone     city
Philip       3345  phil@qqq.com 2233442233 VEG
Tom          2267  tom@kkk.com  8877343434 DAL

有什么想法可以让我们找到方法吗?

【问题讨论】:

  • 欢迎来到 SO,在 SO 上,我们鼓励用户添加他们为解决自己的问题所做的努力,所以请在您的问题中添加相同的内容。
  • 您尚未指定列的分隔方式。如果它们以与单个字段中的单词相同的方式分隔,那么您就有问题了,因为York Jose 先生可以住在New 这个梦幻般的城市。因此,最好的办法是我们可以假设这些字段是制表符分隔的。
  • @EnricoMariaDeAngelis apologies NewYork 将是一个单词,我更新了它并通过空格分隔列

标签: unix awk sed grep


【解决方案1】:

如果您事先不知道日志文件的标头是怎样的,那么您几乎无能为力 标头和with 标头。

因此,在不知道如何利用标题行的情况下,您无法区分 Philip 生活是 Seattle 和 Seattle 先生住在 Philip 城市,您所能做的就是设计一些方法来认识一些领域。

例如,这通过匹配@ 和电话来识别电子邮件 通过匹配超过 4 个数字,然后在除标题行之外的所有行中删除这些列。

awk '
NR == 1 { print; next }
NR == 2 {
  for (i = 1; i <= NF; ++i) {
    if (match($i,/@/)) { email = i }
    if (match($i,/^[0-9]{5,}$/)) { phone = i }
  }
}
{
  $email = ""
  $phone = ""
  print $0
}'

但是,如果您确实知道用户特定列的标题总是匹配某些正则表达式,那么您可以这样做:

awk '
NR == 1 {
  for (i = 1; i <= NF; ++i) {
    if (match(tolower($i),/name/)) { name = i }
    if (match(tolower($i),/phone/)) { phone = i }
    if (match(tolower($i),/mail/)) { mail = i }
  }
}
{
  $name = ""
  $mail = ""
  $phone = ""
  print $0
}'

【讨论】:

  • 感谢您的回答,但这只会删除电子邮件地址,不会删除姓名和电话号码
  • @CodeHeapsters,您可以尝试将awk 脚本(即单引号' 之间的部分)放在文件script 中,然后像在awk -f script logfile.txt 中一样使用它吗?如果这也不起作用,请在问题末尾包含awk --version 的输出。
猜你喜欢
  • 2018-10-07
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多