AWK - 关键短语后的数字减法

AWK - 关键短语后的数字减法

我有一个文件,其中模式字符串重复ABC:10,就像我正在寻找的那样,每次在文件中都ABC:10必须将其转换为XYZ:5

技巧部分是数字部分,例如 10,它是基于时间的,所以每次我下载文件时它都会改变,所以我们可以考虑X数字: ABC:X-> XYZ:(X-5)

在文件中,数字始终相同,但是当我重新下载文件时,它会根据时间表发生变化。另外,身份识别不能丢失也很重要。

对于下面的文件示例,基本上每次我看到等级3剩余:58.1天我都需要修改等级3剩余 -> DATA 和 58.1-> 28.1 (X-30)。每次下载文件时,等级3剩余总是相同的,但数字基本上是剩余天数,所以每过一天就会减少1。

文件示例:

port: 6666
socks-port: 6699
redir-port: 6669
allow-lan: true
mode: Rule
log-level: info
external-controller: 0.0.0.0:9090

dns:
  enable: true
  ipv6: false
  # listen: 0.0.0.0:53
  # enhanced-mode: fake-ip
  nameserver:
    - 223.5.5.5
    - 114.114.114.114
  #  - 'tls://dns.rubyfish.cn:853'
  #fallback:
  #  - 'tcp://208.67.222.222:443'
  #  - 'tls://1.0.0.1:853'
  #  - 8.8.8.8
proxies:
  - type: ss
    server: test.com
    port: 49679
    password: test.com
    cipher: aes-128-gcm
    name: ♥流量:300.93GB 等级3剩:57.8天

proxy-groups:

  - name: 

答案1

尝试

awk -v days=30 '/等级3剩/ { for(i=1;i<=NF;i++)  
     if ( $i ~ /等级3剩:/ ) { split($i,A,":") ; $i = "DATA:" A[2]-days "天" ;}}
     {print;}' 

在哪里

  • /等级3剩/选择“等级3剩”行
  • for(i=1;i<=NF;i++) if ( $i ~ /等级3剩:/ )循环参数寻找模式
  • split($i,A,":")A[1] 和 A[2] 中“:”的分割模式(在本例中)
  • $i = "DATA:" A[2]-days "天" ;调整值
  • { print }打印所有内容(无论行是否被修改)

请注意

  • 为了清楚起见,我将程序放在多行上,您可以一行。

  • 我使用-v days=30这样你可以根据需要使用外部变量(例如-v days=$DAYS

  • 正如评论中提到的,识别似乎丢失了:

      - name: 

相关内容