我为 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) 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。是否可以?