Linux-Shell编程
Shell基础编程
一、find \ grep \ sed \ awk \ cut \ sort \ case \ select 语法
find语法
# -name 按文件名查找 -type f代表文件 d代表目录 $ find 查找路径 [-name/-type] 文件名/*.文件类型
find扩展用法
#只查找指定目录的一级目录 当前目录用"."代替 $ find 查找路径 -maxdepth 1 [-name/-type] 文件名/*.文件类型 #查找文件大于N兆的文件(N代表文件大小) $ find 查找路径 -size +N #查找一天内修改过的文件 $ find 查找路径 [-name/-type] 文件名/*.文件类型 -mtime -1 #查找n天前修改过的文件(n代表天数) $ find 查找路径 [-name/-type] 文件名/*.文件类型 -mtime +n #将查找到的文件删除或拷贝用 -exec (大括号表示查找到的内容) $ find 查找路径 [-name/-type] 文件名/*.文件类型 -exec rm -rf {} \ $ find 查找路径 [-name/-type] 文件名/*.文件类型 -exec cp {} /目标路径/ \
grep基本用法
#基本语法 $ grep "匹配内容" 文件名 #正则匹配("^字符"表示以该字符开头 "字符$"表示以该字符结尾) $ grep "^字符" 文件名 $ grep "字符$" 文件名 #排除匹配内容(-v 表示不显示包含该字符的内容) $ grep -v "字符" #匹配数字 $ grep "[0-9]" 文件名 #匹配字母 $ grep "[a-z]" 文件名 $ grep "[A-Z]" 文件名 #多级匹配 -E 表示egrep,是grep的扩展 例:匹配IP地址 $ grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" #满足两个条件其中一个都取出来 $ egrep "条件1 | 条件2" 文件名
sed用法
#替换文件内容语法 加"-i"会修改原文件 不加则只输出临时结果不修改原文件 $ sed -i 's/原内容/新内容/g' 文件名 #在每行首添加内容 $ sed 's/^/&要加添的内容/g' 文件名 #在每行尾添加内容 $ sed 's/$/&要添加的内容/g' 文件名 #输出包含匹配内容的那一行 p $ sed -n '/匹配内容/P' 文件名 #在匹配内容行的上一行添加内容 i $ sed '/匹配内容/i 添加内容/' 文件名 #在匹配内容行的下一行添加内容 a $ sed '/匹配内容/a 添加内容/' 文件名 #输出第一行 $ sed -n '1P' 文件名 #输出最后一行 $ sed -n '$P' 文件名
awk用法
#取出第n列的内容 $n $ cat 文件名 |awk '{print $n}' #取出最后一列的内容 $NF $ cat 文件名 |awk '{print $NF}' #指定分隔符 -F分隔符 $ cat 文件名 |awk -F: '{print $n}' #在结果中加入自定义内容 print后用""号包起来 $ cat 文件名 |awk '{print "hello"$n}'
cut用法
语法格式 $ cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file] 使用说明 cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。 主要参数 -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符。 -f :与-d一起使用,指定显示哪个区域。 -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
sort用法
#倒序 $ cat 文件名 |sort -nr
case语法
case 变量名 in 参数1 ) 执行A语句... ;; 参数2 ) 执行B语句... ;; ... esac
select命令交互
PS3="请输入对应选项编号: " select 变量名 in "选项1" "选项2" "选项3" "exit" do #执行语句(一般配合case语句)执行交互 case 变量名 in 选项1 ) 执行A语句... ;; 选项2 ) 执行B语句... ;; 选项3 ) 执行c语句... ;; exit ) 执行exit退出命令! ;; esac done
二、循环控制
#for循环 for 变量名 in 取值范围 do 执行语句... done #例:循环输出1-10的整数 for i in seq 10 do echo "This Number=$i" done #while循环 while [ 条件表达式 ] do 条件成立时执行语句... done #例:同上 i=0; while [ $i -gt 10 ] do ((i++)) echo "This Number=$i" done #while从文件中按行读取内容 read while read line do echo $line done < 文件名 #另一种写法 cat 文件名 | while read line do { echo $line } done
三、if分支语句
#if条件判断 -eq:等于 -ne:不等于 -le:小于等于 -ge:大于等于 -lt:小于 -gt:大于 -r file 用户可读为真 -w file 用户可写为真 -x file 用户可执行为真 -f file 文件为正规文件为真 -d file 文件为目录为真 -c file 文件为字符特殊文件为真 -b file 文件为块特殊文件为真 -s file 文件大小非0时为真 -t file 当文件描述符(默认为1)指定的设备为终端时为真 -a 与 -o 或 ! 非 -z 判断 变量的值,是否为空; zero = 0 - 变量的值,为空,返回0,为true - 变量的值,非空,返回1,为false -n 判断变量的值,是否为空 name = 名字 - 变量的值,为空,返回1,为false - 变量的值,非空,返回0,为true [ -n "$pid" ] 单对中括号,变量必须要加双引号 [[ -z $pid ]] 双对中括号,变量不用加双引号 () 子shell中执行 (()) 数值比较,运算 C语言 $() 命令替换 $(()) 整数运算 {} 集合 ${} 变量引用 [] 条件测试 [[]] 条件测试,支持正则表达式 =~ $[] 整数运算 例:求2的10次方 echo $[2**10] #基本语法 if [ 条件表达式 ];then 条件成立执行语句... else 条件不成立执行语句... fi #多重判断 if [ 条件表达式1 ];then 执行语句... elif [ 条件表达式2 ];then 执行语句... else 执行语句... fi #扩展 执行语句中间用&&符号表示前面一名执行成功才执行后面一句 一般可用于代替if多重判断 $ 执行语句A && 执行语句B
四、变量引用
$? 表示上一条命令的退出状态, 结果为0表示上条命令执行成功 $$ 表示当前shell的进程ID $# 表示参数个数 $* 表示所有参数 $@ 一般用于数组,表示所有元素 $0 表示传入脚本的第一个参数 $n 表示传入脚本的第n个参数 #正则表达式 判断是否是数字 "^"表示以什么开头 "+"表示它前面的字符可以有1到多个 "$"表示以什么结尾 $ ^[0-9]+$
五、全量备份与增量备份
全量备份
$ tar -g 路径/快照名 -czvf 路径/压缩后的文件名.tar.gz 路径/备份的目标文件或目录
增量备份
$ tar -g 路径/原快照名 -czvf 路径/压缩后的文件名.tar.gz 路径/备份的目标文件或目录
六、Linux命令取别名
#查看当前shell别名 $ alias #取消别名 $ unalias 命令 #定义临时别名 $ alias 别名='命令 参数' #例:定义个临时别名 $ alias abc='ls -l'