【问题标题】:get specific part of a string and set the another part to null获取字符串的特定部分并将另一部分设置为 null
【发布时间】:2021-06-07 12:52:08
【问题描述】:

希望你一切都好

我想获取我的字符串的子字符串,其格式为:18d6m2s 等等.. 我感兴趣的只是获取天数,如果字符串仅包含分钟/秒,我想获取null/零的值..

例子:

age=12d23m2s ... the needed output is 12
age=21m... the needed output is 0
age=22s... the needed output is 0

我的解决方案是使用 cut(我不能有单独的 bash 脚本,这将是另一个命令的输入..)..

我的解决方案:

 awk -F "d" '{print $1}' $6 

但这仅对带有 d 字符的字符串有效.. 我想将仅包含 m/s 的字符串设置为零/空..

我该怎么做?

【问题讨论】:

  • 样本数据的预期输出是什么?请不要将其发布为 cmets 或图像,而是将其编辑为原始问题。谢谢。
  • 我已经在问题的第一部分提供了所需的输出 :)

标签: bash


【解决方案1】:

我们可以使用NF var 来检查是否找到了分隔符(d),并相应地使用print

#!/bin/bash

awk -F "d" '{print (NF > 1) ? $1 : 0}' <<< '12d23m2s'
awk -F "d" '{print (NF > 1) ? $1 : 0}' <<< '21m'
awk -F "d" '{print (NF > 1) ? $1 : 0}' <<< '22'
12
0
0

Try it online!

【讨论】:

  • 这工作正常,但我怎样才能将它分配给一个值?这是命令,下面的命令应该分配给这里的年龄..你能帮忙吗? ` kubectl 获取 pod -A | awk {'printf "%s %s %s %s\n", $1,$2,$4,$6'} | grep -E "被驱逐" |而读线;做 ns=$(echo $line | cut -d , -f 1); pod=$(echo $line | cut -d , -f 2); ag e=$(echo $line | cut -d, -f 6);如果 [[$age -gt 30]];然后 kubectl 删除 pod --dry-run='server' -n $ns $pod;完成了`
  • Assign the result to a variable age="$(your-command)",然后将该变量传递给 awk:awk -F "d" '{print (NF &gt; 1) ? $1 : 0}' &lt;&lt;&lt; "$age"
  • 这是正确的吗? ` kubectl 获取 pod -A | awk {'printf "%s %s %s %s\n", $1,$2,$4,$6'} | grep -E "被驱逐" |而读线;做 ns=$(echo $line | cut -d , -f 1); pod=$(echo $line | cut -d , -f 2);年龄=$(回声 $line | 剪切 -d, -f 6) | final_age=awk -F "d" '{打印 (NF > 1) ? $1 : 0}'
  • 不确定m8,请将代码添加到原帖中,通过评论无法阅读。
  • 创建了另一个问题,你能看看吗? stackoverflow.com/questions/67877807/…
【解决方案2】:

你可以使用参数扩展:

for age in 12d23m2s 12d 12d1s 21m1s 22s ; do
    days=${age%d*}  # Remove everything starting from "d".
    if [[ $days == *[ms]* ]] ; then
        days=0
    fi
    echo $days
done

【讨论】:

    【解决方案3】:

    你可以使用正则表达式:

    if [[ $age =~ ([0-9]+)d ]]; then
      echo "${BASH_REMATCH[1]}"
    fi
    

    封装成函数:

    get_days() {
      [[ $1 =~ ([0-9]+)d ]] && echo "${BASH_REMATCH[1]}" || echo 0
    }
    
    for age in  12d23m2s  21m  22s; do
      days=$(get_days "$age")
      echo "days in $age => $days"
    done
    
    days in 12d23m2s => 12
    days in 21m => 0
    days in 22s => 0
    

    【讨论】:

      【解决方案4】:

      使用 perl 单线,在 =d 之间挖掘:

      $ perl -ne '(/(?<==)(\d+)(?=d)/ && print "$1\n") || print "0\n";' file
      

      输出:

      12
      0
      0
      

      【讨论】:

        猜你喜欢
        • 2011-12-03
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多