跳到主要内容

5 篇博文 含有标签「shell」

查看所有标签

字符串三剑客: awk

· 阅读需 2 分钟

awk 是一个强大的文本处理工具,用于处理结构化文本数据。以下是一些在使用 awk 时的小技巧:

  1. 基本用法:

    awk '{print $1}' filename

    这将打印文件中每行的第一个字段。

  2. 指定字段分隔符:

    awk -F':' '{print $1}' /etc/passwd

    这将使用冒号作为字段分隔符来处理 /etc/passwd 文件。

  1. 条件匹配和处理:

    awk '/pattern/ {print $2}' filename

    这将打印包含指定模式的行的第二个字段。

  2. 计算和使用变量:

    awk '{sum+=$1} END {print sum}' filename

    这将计算文件中第一个字段的总和,并在文件结束时打印结果。

  3. 自定义输出格式:

    awk '{printf "Name: %-10s Age: %s\n", $1, $2}' filename

    这将按照指定格式输出字段内容,使用 printf 函数。

  4. 处理列之间的关系:

    awk '$2 > 50 {print $1, "is greater than 50"}' filename

    这将打印第一个字段,如果第二个字段大于50,则输出附加信息。

  5. 统计行数:

    awk 'END {print NR}' filename

    这将在文件结束时打印行数。

  6. 自定义分隔符输出:

    awk '{print $1 "|" $2}' filename

    这将在输出中使用自定义分隔符。

tar 带密码压缩

· 阅读需 2 分钟

比如对 app 目录进行压缩备份,带上密码,可以使用以下操作

tar -czvf - /app | openssl enc -aes-256-cbc -e > backup.tar.enc

解释一下以上命令:

  • tar -czvf - /app 将/app目录压缩成一个tar包,并将其输出到stdout。
  • openssl enc -aes-256-cbc -e 将stdin中的数据用AES-256-CBC算法进行加密,并将加密后的数据输出到stdout。
  • > backup.tar.enc 将stdout中的数据输出到backup.tar.enc文件中。

在执行以上命令时,会提示输入密码,输入密码后就会生成加密后的backup.tar.enc文件。要解密该文件,可以使用以下命令:

openssl enc -aes-256-cbc -d -in backup.tar.enc | tar -xzvf -

解释一下以上命令:

  • openssl enc -aes-256-cbc -d -in backup.tar.enc 从backup.tar.enc文件中读取加密后的数据,并使用AES-256-CBC算法进行解密,将解密后的数据输出到stdout。
  • tar -xzvf - 将stdin中的数据解压缩,并将解压缩后的数据输出到stdout。 通过将以上两个命令结合使用,就可以对/app目录进行加密备份和解密恢复了。

不使用交互式

密码直接写在命令行中

压缩

tar -czvf - /app | openssl enc -aes-256-cbc -e -pass "pass:my_super_secret_password" > backup.tar.enc

解压

openssl enc -aes-256-cbc -d -in backup.tar.enc -pass "pass:my_super_secret_password" | tar -xzvf -

Shell 使用技巧

· 阅读需 2 分钟

修改全局变量

#!/bin/bash

my_var="initial value"

my_function() {
# 声明 my_var 为全局变量
declare -g my_var
my_var="new value"
}

echo "Before function call: my_var=$my_var"
my_function
echo "After function call: my_var=$my_var"

获取脚本所在绝对路径

脚本中涉及到一些路径的时候可以用绝对路径,这样可以再任意地方执行脚本。而不用 cd 到固定的目录

## 获取脚本自身所在目录绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
echo "SCRIPT_DIR: $SCRIPT_DIR"

文件路径相关操作

# 获取目录名
DIR=$(dirname /path/file.txt) # /path

# 获取文件名
FILE=$(basename /path/file.txt) # file.txt

# 获取文件名,不带文件类型后缀
FILE_NAME=${FILE.*} # file

获取环境变量的值

# 获取环境变量 VAR 的值,如果没有则是 default_value
VAR="${VAR:-default_value}"

多行字符串换行符处理

某些 CI/CD 流程中可能会涉及到一些多行字符串,需要对换行符进行特殊处理,比如转义

# 原始字符串
original_string=" 这是一个包含
换行符的
字符串 "

# 将换行符替换成 ###
escape_string=$(echo "$original_string" | sed ':a;N;$!ba; s/\n/###/g')
echo $escape_string
# 会输出 "这是一个包含 ### 换行符的 ### 字符串"

后台执行程序

$(COMMOND &)

nohup COMMOND &

字符串三剑客: sed

· 阅读需 2 分钟

sed 小技巧:

  1. 替换字符串:

    sed 's/old_string/new_string/g' filename

    这将在文件中将所有的 old_string 替换为 new_string

  2. 删除行:

    sed '/pattern/d' filename

    这将删除包含指定模式的行。

  1. 在行首或行尾插入文本:

    sed 's/^/prefix/' filename   # 在每一行行首添加前缀
    sed 's/$/suffix/' filename # 在每一行行尾添加后缀
  2. 显示特定行或行范围:

    sed -n '5p' filename          # 显示第5行
    sed -n '5,10p' filename # 显示第5到第10行
  3. 使用变量:

    my_variable="new_value"
    sed "s/old_value/$my_variable/" filename
  4. 多个替换:

    sed -e 's/old1/new1/g' -e 's/old2/new2/g' filename

    这可以在同一次 sed 命令中执行多个替换。

  5. 保留替换前的备份文件:

    sed -i.bak 's/old_string/new_string/g' filename

    -i.bak 将替换前的文件备份为 .bak 文件。

  6. 仅显示匹配部分:

    sed -n 's/pattern/\1/p' filename

    这将仅显示匹配到的部分,使用 \1 表示匹配到的内容。

  7. 转换大小写:

    sed 's/[a-z]/\U&/g' filename   # 将小写字母转换为大写
    sed 's/[A-Z]/\L&/g' filename # 将大写字母转换为小写

    \U\L 分别用于将后面的文本转换为大写和小写。

字符串三剑客: grep

· 阅读需 2 分钟

grep 命令小技巧

  1. 简单搜索:

    grep "pattern" filename

    这将在文件中搜索匹配指定模式的行。

  2. 忽略大小写:

    grep -i "pattern" filename

    -i 选项将忽略大小写。

  1. 显示匹配行的行号:

    grep -n "pattern" filename

    -n 选项将显示匹配行的行号。

  2. 显示不匹配的行:

    grep -v "pattern" filename

    -v 选项将显示不包含匹配模式的行。

  3. 只显示匹配部分:

    grep -o "pattern" filename

    -o 选项将只显示匹配到的部分。

  4. 显示匹配行之前或之后的行:

    grep -A 2 "pattern" filename   # 显示匹配行及后面2行
    grep -B 2 "pattern" filename # 显示匹配行及前面2行
    grep -C 2 "pattern" filename # 显示匹配行及前后各2行

    -A-B-C 选项用于显示匹配行之前或之后的指定行数。

  5. 递归搜索子目录:

    grep -r "pattern" directory

    -r 选项将递归搜索指定目录及其子目录。

  6. 显示匹配行的上下文:

    grep -C 2 "pattern" filename   # 显示匹配行及前后各2行

    -C 选项用于显示匹配行的上下文。

  7. 仅显示匹配的行数:

    grep -c "pattern" filename

    -c 选项将仅显示匹配的行数,而不是具体的行内容。