更多精彩内容,请关注微信公众号:后端技术小屋
《Linux Shell脚本攻略》是一本适合初学者系统学习Bash Shell的书籍,墙裂推荐。以下是我阅读这本书的笔记,希望对读者有用。
- 输出颜色字符
echo -e "\e[1:41m" # 1表示背景色
- echo打印!需转义
echo "hello, bash!" # 报错,因为!在shell中属于特殊字符,需要转义
echo "hello, bash\!" # 不报错,!已转义
echo 'hello, bash!' # 不报错,在单引号中!无需转移
- printf可用于格式化输出
# 用法类似C中的`printf`
printf "format" var1 var2 ...
- echo常用选项
echo -n # 不在字符串末尾添加换行符
echo -e # 支持转义字符表示
echo -e "\e[id XXXXXX" # 显示颜色字体,其中id表示背景颜色id
- pgrep
# 根据进程名获取进程id
pgrep <进程名> # 相当于ps -ef
cat /proc/$PID/environ # 查看进程运行过程中的环境变量
- 用(())进行算数运算
# 计算两个数之和,有以下两种写法:
c=$((a+b)) # 赋值方式1
((c = a+b)) # 赋值方式2
- 输出重定向
# 将标准输出和标准错误输出重定向到run.log中
./binary >run.log 2>&1
# 更简洁的写法:注意&和>之间不能有空格
sh mybash.sh &>run.log
- 用exec创建文件描述符
exec 4 < log.txt
exec 5 > log.txt
exec 6 >> log.txt
- 哈希数组
# 声明
declare -a map
# 定义
${map[key]}=value
# 获取所有key
${!map[@]}
declare -a HTTP_RESPONSE=(
[200]="OK"
[400]="Bad Request"
[403]="Forbidden"
[404]="Not Found"
[405]="Method Not Allowed"
[500]="Internal Server Error"
)
- date获取时间
# 显示秒数
date +%s
# 将秒数转成字符串
date -d @秒数
11 tput控制终端光标
# 设置光标位置
tput cup 行号 列号
# 保存光标位置
tput sc
# 回到保存的光标位置
tput rc
# 清除当前光标到行尾
tput ed
- read读取标准输入
# 设置不回显
read -s
# 设置超时时间
read -t
# 设置读入字节数
read -n 字节数
# 设置提示
read -p "please input passwd"
- cat显示文件内容
# 显示时忽略多余的空行
cat -s file
# 显示每一行的行号
cat -n file
# 打印出制表符
cat -T file
- 用find进行文件搜索
# 打印符合搜索条件的文件或目录
find -name XXX -print
# 删除符合条件的文件或目录
find -name XXX -exec rm -rf {} \;
- xargs:从标准输入拼装命令
# 常用用法
cat file | xargs
# 设定每行的字段数
cat file | xargs -n 3
# 以null为换行符
cat file | xargs -0
# 代替命令中位置
cat file | xargs -I{} rm -rf {}
- tr: 替换或删除标准输入的字符
# 替换
tr 字符集1 字符集2
# 删除
tr -d 字符集
# 补集
tr -d -c 要留下的字符集
# 去除重复空格
tr -s " "
- md5sum: 对文件生成md5 checksum
# 生成md5值
md5sum file > file.md5
# 校验
md5sum -c file.md5
- sort: 对文件内容进行排序
# 按照字符串排序
cat file | sort
#按照数字排序
cat file | sort -n
# 逆序排序
cat file | sort -r
# 按照某列排序
cat file | sort -k 列数
- dd:复制并转换文件
# 从/dev/zero生成文件
dd if=/dev/zero of=data.file bs=100k count=1
- split:分割大文件
# 将文件分成大小为10k的小文件,且小文件命名中后缀长度为3
split data.file -b 10k -a 3
- 字符串分割
# 获取文件后缀
echo ${filename##*.}
# 获取文件名
echo ${filename%.*}
- 单词表
cat /usr/share/dict/words
- expect: 自动化交互式输入
# expect
spawn ./interactive.sh
expect "Password:"
send "XXX\n"
- comm: 求两个文件的交集/差集/并集
# 求差集a-b
comm a.txt b.txt -1
# 求a+b并集
comm a.txt b.txt
# 求ab交集
comm a.txt b.txt -1 -2
- chattr: 修改文件属性
# 将文件设置为不可修改
chattr +i file
# 去除不可修改属性
chattr -i file
- 寻找软连接
# 方法一
ll -rt | grep -P "^l" | awk '{print $8}'
# 方法二
find . -type l
- diff: 比对两个文件(或目录)
diff -abru 1.txt 2.txt
diff -abru 1.txt 2.txt > 12.patch
- patch: 对文件打补丁
patch -p1 1.txt < 12.patch
- 命令行当前目录管理
# pushd: 将当前目录压入栈中
# popd: 从栈中弹出目录,并作为当前目录
# dirs: 显示栈中目录
# 常规用法
pushd directory
popd
# 指定目录
dirs
pushd +N
popd +N
- grep: 搜索文件内容
# 匹配内容显示颜色
grep --color=auto
# 统计匹配行数
grep -c
# 显示匹配行号
grep -n
# 显示匹配字符偏移量
grep -o -b
# 显示匹配文件列表
grep -l 1.txt 2.txt
# 使用文件匹配
grep -f pattern.txt file.txt
# 静默模式
grep -q
# 定位代码
grep -R -n
# 忽略大小写
grep -i
# 匹配多个样式
grep -e pattern1 -e pattern2
# 显示匹配行之前N行
grep -A
# 显示匹配行之后N行
grep -B
# 显示匹配行之前之后N行
grep -C
- sed: 文本过滤和转换工具
# sed "s///" 替换
echo "hello wolrd" | sed "s/hello/goodbye/"
# sed -i 替换文件内容
sed -i 's/hello/goodbye/' 1.txt
# sed 's///g' 替换所有匹配内容
echo "thisthisthisthis" | sed 's/this/THIS/g'
# sed 's///ng' 从第n处匹配开始替换
echo "thisthisthisthis" | sed 's/this/THIS/2g'
# sed '//d' 删除匹配行
cat diff.sh | sed '/^$/d'
# 匹配字符串标记
echo this is an example | sed 's/\w\+/[&]/g'
# 捕捉字符串
echo "this is a digit 7 in a numbger" | sed 's/digit \([0-9]\)/\1/'
- paste: 合并文件
# 按列合并文件
paste file1 file2
paste file1 file2 -d ","
- rev: 字符串逆序输出
echo "1234" | rev
- tac: 对多行文件逆序输出
# 行逆序
seq 1 10 | tac
- 设置命令行编辑模式
set -o vi
推荐阅读
- STL源码分析--vector
- STL源码分析--hashtable
- STL源码分析--algorithm
- zookeeper client原理总结
- redis实现分布式锁
- 推荐几个好用的效率神器
- C/C++关键字之restrict
- 现代C++之右值语义
- Python乱码九问
更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。