小编Dan*_*one的帖子

shell脚本中的变量插值

我为 pg 备份编写了以下 shell 脚本:

#!/bin/bash

PG_USER=donato
DATABASE=mydb
SERVER=216.58.219.174
DIR="$HOME/pg_bak"
DATE=$(date +"%m_%d_%y")
FILE="$DATABASE_$DATE"
ERROR_FILE="$HOME/pg_bak/error_bak/$FILE_error.txt"
# pass @ .pgpass

PG_BAK_NOW () {
  pg_dump -h $SERVER -U $PG_USER $DATABASE >$FILE 2>$ERROR_FILE
  code=$?
  if [ $code -ne 0 ]; then
    echo 1>&2 "The backup failed (exit code $code), check for errors in $ERROR_FILE"
  fi
}

echo "Ready to dump to $FILE" >> "$HOME/pg_status" 

cd $DIR
if [ -f "$FILE" ];
then
  rm $FILE
  PG_BAK_NOW 
else
  PG_BAK_NOW
fi
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我知道它会执行一段时间:

$ pgrep -fl pg_bak.sh
4603 …
Run Code Online (Sandbox Code Playgroud)

bash shell-script

7
推荐指数
1
解决办法
2万
查看次数

使用 awk 从 bash shell 中提取 json 值,而不必同时求助于 awk 和 sed

aws 命令将 json 字符串返回到 bash shell 内的标准输出。

$ aws ssm get-parameter --name /mysite/dev/email
{
    "Parameter": {
        "Name": "/mysite/dev/email",
        "Type": "String",
        "Value": "admin@example.com",
        "Version": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

我想返回“Value”的值,而不用引号括起来。我使用了 awk 和 sed linux 程序的组合。基本上,awk 搜索输入中的每一行,并允许您返回具有匹配值的行。由于 awk 逐行扫描文件,允许您将行拆分为字段并对匹配的模式执行操作,因此我首先这样做:

$ aws ssm get-parameter --name /mysite/dev/email | awk -F: '/Value/ {print $2}'

"admin@example.com",
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我使用 : 作为通过 F 标志进行分隔。我将该行与字符串“Value”匹配,然后打印分隔字符串的第二部分,即值“user@example.com”,

但引号和逗号不受欢迎。所以我必须使用 sed 和 -E 正则表达式标志来替换引号和逗号:

$ aws ssm get-parameter --name /mysite/dev/email | awk -F: '/Value/ {print $2}' | sed -E 's/"|",//g'
 admin@example.com
Run Code Online (Sandbox Code Playgroud)

我得到了想要的结果,但我更愿意只使用 awk,而不是通过管道将 awk 传输到 sed。是否可以?

sed awk json aws

4
推荐指数
1
解决办法
8010
查看次数

标签 统计

awk ×1

aws ×1

bash ×1

json ×1

sed ×1

shell-script ×1