如何:在bash中打印键/值对中的值

时间:2016-10-15 04:01:59

标签: bash

我只需要在此行中打印900auth required pam_faillock.so preauth silent deny=3 unlock_time=604800 fail_interval=900

但是,此行并不总是按此顺序排列。

我需要了解如何在=之后打印值。 我需要为unlock_timefail_interval

执行此操作

我一整夜都在寻找能够完全适合我并且找不到它的东西。我一直在玩sed和awk并且还没有把它钉死。

4 个答案:

答案 0 :(得分:3)

让我们定义你的字符串:

s='auth required pam_faillock.so preauth silent deny=3 unlock_time=604800 fail_interval=900'

使用awk:

$ printf %s "$s" | awk -F= '$1=="fail_interval"{print $2}' RS=' '
900

或者:

$ printf %s "$s" | awk -F= '$1=="unlock_time"{print $2}' RS=' '
604800

如何运作

Awk将其输入分为记录。我们告诉它使用空格作为记录分隔符。每条记录分为几个字段。我们告诉awk使用=作为字段分隔符。更详细:

  • printf %s "$s"

    这会打印字符串。如果字符串可能以printf开头,则echo-更安全。

  • -F=

    这告诉awk使用=作为字段分隔符。

  • $1=="fail_interval" {print $2}

    如果第一个字段是fail_interval,那么我们告诉awk打印第二个字段。

  • RS=' '

    这告诉awk使用空格作为记录分隔符。

答案 1 :(得分:0)

您可以将sed用于此

<强>命令

echo "...stuff.... unlock_time=604800 fail_interval=900" | sed -E '
s/^.*unlock_time=([[:digit:]]*).*fail_interval=([[:digit:]]*).*$/\1 \2/'

<强>输出

604800 900

备注

  • (..)中的sed用于选择。
  • [[:digit:]]*0-9用于匹配任意数量的数字
  • \1\2用于按顺序替换匹配的内容。

答案 2 :(得分:0)

尝试使用它。

unlock_time=$(echo "auth required pam_faillock.so preauth silent deny=3 unlock_time=604800 fail_interval=900" | awk -F'unlock_time=' '{print $2}' | awk '{print $1}')

echo "$unlock_time"

fail_interval=$(echo "auth required pam_faillock.so preauth silent deny=3 unlock_time=604800 fail_interval=900" | awk -F'fail_interval=' '{print $2}' | awk '{print $1}')

echo "$fail_interval"

答案 3 :(得分:0)

给出input变量:

input="auth required pam_faillock.so preauth silent deny=3 unlock_time=604800 fail_interval=900"

使用GNU grep:

$ grep -oP 'fail_interval=\K([0-9]*)' <<< "$input"
900
$ grep -oP 'unlock_time=\K([0-9]*)' <<< "$input"
604800