基本输出
echo
#! /bin/bash
# 输出普通字符
echo "hello world"
# 输出环境变量
echo $HOME
# 输出带变量的字符串。变量赋值命令不能存在空格
echo "hello \"world"\""
name=world
my_name=$name
echo "hello $name"
echo "hello \"$my_name\""
# 输出换行字符串
echo -e "Yes\nNo"
# 将输出内容重定向到文件中
echo "hello world" > test.txt
# 将输出内容追加到文件中
echo "hello world" >> test.txt
# 输出其他命令的执行结果
echo `uname -a`
#! /bin/bash
# 单、双引号的效果相同。多余的参数仍会按照指定格式输出
printf '%d %s' 5333 abcdef
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 无引号,只能指定一个输出参数
printf %s abcdef
# 如果没有参数,%s 的输出结果为空,%d 的输出结果为0
printf "%s and %d \n"
# 格式化输出,
# %-10 > 宽度为 10 个字符,左对齐。右对齐把 “-” 改为 0
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
数字运算
普通的数字运算仅支持整数运算
#! /bin/bash
# 括号中的变量可以使用空格作为间隔
num01=10
num02=20
num03=$[ $num01 * $num02 ]
num04=$[$num01*($num02+$num03)]
echo $num04
利用 bc 命令可实现浮点数计算
#! /bin/bash
# bc 可用于除法、取余和乘幂运算,对乘法运算无效
var1=3
var2=5
var3=$(echo "scale=2; $var1 / $var2" | bc)
var4=$(echo "scale=4; $var1 / $var2" | bc)
var5=$(echo "scale=4; $var1 * $var2" | bc)
echo -e "result:\n$var3\n$var4\n$var5"
文本处理
cat
#! /bin/bash
# 输出文件内容并显示行数
cat -n /etc/passwd
# 将两个文件的内容拼接并输出到新文件中
cat file01.txt file02.txt > /opt/newfile.txt
# 将多行自定义内容添加到新文件中并覆盖原文件内容
cat > /opt/newfile.txt >> EOF
This is the first line.
This is the second line.
EOF
# 快速清空文件内容
cat /dev/null > /opt/newfile.txt
# 输出文件中包含某关键字符串的一行内容
cat /etc/passwd | grep "mail"
grep
# 输出匹配行的前 10 行 和后 10 行
grep "mail" /etc/passwd -B 10
grep "mail" /etc/passwd -A 10
# 不输出结果,只返回 0 或 1
grep "mail" /etc/passwd -q
# 搜索结果取反
grep "mail" /etc/passwd -v
# 精确匹配
grep "mai" /etc/passwd -w
# 输出指定路径下包含关键字符串的所有文件内容行
grep "halt" /etc/ -w -r
# 查询并出去的文件中排除 .log 文件
grep "halt" /etc/ -w -r --exclude="*.conf"
sed
# sed 命令不会直接操作原文件,添加 -i 参数可实现对原文件的修改
sed '/old/d' test.txt # 删除所有包含 old 的行
# 插入
sed '/FTP/a\456' /opt/111.txt # 在所有含有FTP的行后面新插入一行,内容为456
sed '/FTP/i\123' /opt/111.txt # 在所有含有FTP的行前面新插入一行,内容为123
sed -i '5 a\123' /opt/111.txt # 在第5行后插入一新行,内容为123
sed -i.bak '5 a\123' /opt/111.txt # 修改文件的同时生成备份文件
# 替换
sed '0,/test/s/test/newtest/' test.txt # 仅替换第一个匹配字符串
sed 's/test/newtest/g' test.txt # 替换每行所有匹配的字符串
sed 's/test/newtest/' test.txt # 替换每行的第一个匹配字符串
sed '1,3s/test/newtest/' test.txt # 替换第1到第3行匹配字符串
sed '/test/s/^/#/' test.txt # /test/ 表示只对包含“test”字符串的行操作,“/^/#/”表示在开头添加 #
# 删除注释行
sed '/^#/d' test.txt > new_test.txt
sed -i '/^#/d' test.txt
sed -i '/^[[:space:]]*#/d' test.txt # 对行前有空格或制表符的内容也生效
# 结合正则表达式来获取文本
sed 's, release .*$,,g' /etc/system-release
awk
#默认以空格为分隔符
awk 'NR==1' /etc/passwd # 输出第一行内容
awk -F: '{print NR}' /etc/passwd # 显示文件内容的行数
awk 'NR==1 {print $2}' /etc/passwd # 输出第一行的第二段字符串
# 指定分隔符
awk -F: '{print $1}' /etc/passwd # 以冒号为分隔符,打印每一行的第一段字符串
awk -F: '{print $1, $6}' /etc/passwd # 以冒号为分隔符,打印分割之后的第一段和第六段字符串
# 计算 /etc/passwd 文件中内容的行数,但排除注释行(以 # 开头)
awk -F: '/^#/ {next} END {print NR}' /etc/passwd
# 综合应用:获取主机真实 ip
ip addr show | grep 'inet ' | awk 'NR==2 {print $2}'|cut -d '/' -f 1
find
# 按文件和文件夹查询
find . -name example.txt # 精确查找
find . -iname example.txt # 模糊查找
find . -name example.txt -type f # 查询文件
find . -name example.txt -type d # 查询文件夹
find . -name example.txt -maxdepth 1 -type f # 只在当前文件夹查询,不进入子文件夹
find . -name example.txt -type f -not -path "*/node_modules/*" # 查询时排除 node_modules 文件夹
# 按类型和时间查询
find . -name "*.txt" # 查询所有 txt 文件
find . \( -name "*.txt" -o -name "*.log" \) # 查询所有 txt 和 log 文件
find . -name "*.txt" -size +1M # 查询大于 1m 的文件
find . -name "*.txt" -size -100k # 查询小于 100k 的文件
find . -name "*.txt" -mtime 0 # 查询 24 小时内被修改过的文件
# 查询之后执行命令
find . -name example.txt -type f -exec ls -l {} \; # 对查询结果执行 ls -l 命令
find . -name example.txt -type f -exec rm {} \; # 对查询结果执行 rm 命令
cut、sort 、uniq 和 wc
# 按字符切分
echo "hello world" | cut -c 1-5
# 按字段切分。-d 指定分隔符,-f 指定获取分割之后的第几段字符串
echo "field1,field2,field3" | cut -d ',' -f 2
# 对文件内容进行排序,-r 参数对排序内容取反
sort -r /etc/passwd
# 输出文件内容并去除重复行
sort /opt/test.txt | uniq
# 去重并在每一行前面添加重复行出现的次数
sort /opt/test.txt | uniq -c
# 仅输出重复行
sort /opt/test.txt | uniq -d
#仅输出不重复行
sort /opt/test.txt | uniq -u
# 计算总行数
wc -l /opt/test.txt
grep -c '[^[space:]]' /opt/test.txt # 不包含空格行