Linux-shell实例手册-脚本

以下为讲解shell基础和高级脚本的实例手册。需要的时候建议多翻翻,喜欢就点赞收藏哦!

文章目录

[1 shell基础脚本](#1 shell基础脚本)

[2 xargs](#2 xargs)

[3 正则表达式](#3 正则表达式)

[3.1 元字符](#3.1 元字符)

[3.2 字符类:空白字符](#3.2 字符类:空白字符)

[3.3 字符类:锚定字符](#3.3 字符类:锚定字符)

[3.4 捕获](#3.4 捕获)

[3.5 零宽断言](#3.5 零宽断言)

[3.6 特殊字符](#3.6 特殊字符)

[4 流程结构](#4 流程结构)

[4.1 if判断](#4.1 if判断)

[4.2 case分支选择](#4.2 case分支选择)

[4.3 while循环](#4.3 while循环)

[4.4 for循环](#4.4 for循环)

[4.5 until循环](#4.5 until循环)

[4.6 流程控制](#4.6 流程控制)

[5 变量](#5 变量)

[5.1 定义变量类型](#5.1 定义变量类型)

[5.2 系统变量](#5.2 系统变量)

[5.3 变量引用技巧](#5.3 变量引用技巧)

[6 test条件判断](#6 test条件判断)

[6.1 expression为文件操作](#6.1 expression为文件操作)

[6.2 expression为整数操作](#6.2 expression为整数操作)

[6.3 两值比较](#6.3 两值比较)

[7 重定向](#7 重定向)

[8 运算符](#8 运算符)

[9 数学运算](#9 数学运算)

[9.1 let](#9.1 let)

[9.2 expr](#9.2 expr)

[9.2.1 数值测试](#9.2.1 数值测试)

[9.3 bc](#9.3 bc)

[10 grep](#10 grep)

[11 tr](#11 tr)

[12 seq](#12 seq)

[13 trap](#13 trap)

[14 awk](#14 awk)

[14.1 内建变量](#14.1 内建变量)

[14.2 内置函数](#14.2 内置函数)

[14.3 awk判断](#14.3 awk判断)

[14.4 awk循环](#14.4 awk循环)

[14.5 取本机IP](#14.5 取本机IP)

[14.6 查看磁盘空间](#14.6 查看磁盘空间)

[14.7 排列打印](#14.7 排列打印)



1 shell基础脚本

#!/bin/sh # 在脚本第一行脚本头 # sh为当前系统默认shell,可指定为bash等shell

sh -x # 执行过程

sh -n # 检查语法

(a=bbk) # 括号创建子shell运行

basename /a/b/c # 从全路径中保留最后一层文件名或目录

dirname # 取路径

$RANDOM # 随机数

# 进程号 source FileName # 在当前bash环境下读取并执行FileName中的命令 # 等同 . FileName sleep 5 # 间隔睡眠5秒 trap # 在接收到信号后将要采取的行动 trap "" 2 3 # 禁止ctrl+c $PWD # 当前目录 $HOME # 家目录 $OLDPWD # 之前一个目录的路径 cd - # 返回上一个目录路径 local ret # 局部变量 yes # 重复打印 yes \|rm -i \* # 自动回答y或者其他 ls -p /home # 查看目录所有文件夹 ls -d /home/ # 查看匹配完整路径 echo -n aa;echo bb # 不换行执行下一句话 将字符串原样输出 echo -e "s\\tss\\n\\n\\n" # 使转义生效 echo $a \| cut -c2-6 # 取字符串中字元 echo {a,b,c}{a,b,c}{a,b,c} # 排列组合(括号内一个元素分别和其他括号内元素组合) echo $((2#11010)) # 二进制转10进制 echo aaa \| tee file # 打印同时写入文件 默认覆盖 -a追加 echo {1..10} # 打印10个字符 printf '%10s\\n'\|tr " " a # 打印10个字符 pwd \| awk -F/ '{ print $2 }' # 返回目录名 tac file \|sed 1,3d\|tac # 倒置读取文件 # 删除最后3行 tail -3 file # 取最后3行 outtmp=/tmp/$$\`date +%s%N\`.outtmp # 临时文件定义 :(){ :\|:\& };: # 著名的 fork炸弹,系统执行海量的进程,直到系统僵死 echo -e "\\e\[32m颜色\\e\[0m" # 打印颜色 echo -e "\\033\[32m颜色\\033\[m" # 打印颜色 echo -e "\\033\[0;31mL\\033\[0;32mO\\033\[0;33mV\\033\[0;34mE\\t\\033\[0;35mY\\033\[0;36mO\\033\[0;32mU\\e\[m" # 打印颜色 ## 2 xargs # 命令替换 -t 先打印命令,然后再执行 -i 用每项替换 {} find / -perm +7000 \| xargs ls -l # 将前面的内容,作为后面命令的参数 seq 1 10 \|xargs -i date -d "{} days " +%Y-%m-%d # 列出10天日期 ## 3 正则表达式 \^ # 行首定位 $ # 行尾定位 . # 匹配除换行符以外的任意字符 \* # 匹配0或多个重复字符 + # 重复一次或更多次 ? # 重复零次或一次 ? # 结束贪婪因子 .\*? 表示最小匹配 \[\] # 匹配一组中任意一个字符 \[\^\] # 匹配不在指定组内的字符 \\ # 用来转义元字符 \< # 词首定位符(支持vi和grep) \ # 词尾定位符(支持vi和grep) love\> x\\{m\\} # 重复出现m次 x\\{m,\\} # 重复出现至少m次 x\\{m,n\\} # 重复出现至少m次不超过n次 X? # 匹配出现零次或一次的大写字母 X X+ # 匹配一个或多个字母 X () # 括号内的字符为一组 (ab\|de)+ # 匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配 \[\[:alpha:\]\] # 代表所有字母不论大小写 \[\[:lower:\]\] # 表示小写字母 \[\[:upper:\]\] # 表示大写字母 \[\[:digit:\]\] # 表示数字字符 \[\[:digit:\]\[:lower:\]\] # 表示数字字符加小写字母 ### 3.1 元字符 \\d # 匹配任意一位数字 \\D # 匹配任意单个非数字字符 \\w # 匹配任意单个字母数字下划线字符,同义词是 \[:alnum:\] \\W # 匹配非数字型的字符 ### 3.2 字符类:空白字符 \\s # 匹配任意的空白符 \\S # 匹配非空白字符 \\b # 匹配单词的开始或结束 \\n # 匹配换行符 \\r # 匹配回车符 \\t # 匹配制表符 \\b # 匹配退格符 \\0 # 匹配空值字符 ### 3.3 字符类:锚定字符 \\b # 匹配字边界(不在\[\]中时) \\B # 匹配非字边界 \\A # 匹配字符串开头 \\Z # 匹配字符串或行的末尾 \\z # 只匹配字符串末尾 \\G # 匹配前一次m//g离开之处 ### 3.4 捕获 (exp) # 匹配exp,并捕获文本到自动命名的组里 (?\exp) # 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp) # 匹配exp,不捕获匹配的文本,也不给此分组分配组号 ### 3.5 零宽断言 (?=exp) # 匹配exp前面的位置 (?\<=exp) # 匹配exp后面的位置 (?!exp) # 匹配后面跟的不是exp的位置 (?\6?5:8)) # 判断两个值满足条件的赋值给变量 A=(a b c def) # 将变量定义为組数 $1 $2 $\* # 位置参数 \*代表所有 env # 查看环境变量 env \| grep "name" # 查看定义的环境变量 set # 查看环境变量和本地变量 read name # 输入变量 readonly name # 把name这个变量设置为只读变量,不允许再次设置 readonly # 查看系统存在的只读文件 export name # 变量name由本地升为环境 export name="RedHat" # 直接定义name为环境变量 export Stat$nu=2222 # 变量引用变量赋值 unset name # 变量清除 export -n name # 去掉只读变量 shift # 用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1 name + 0 # 将字符串转换为数字 number " " # 将数字转换成字符串 ### 5.1 定义变量类型 declare 或 typeset -r 只读(readonly一样) -i 整形 -a 数组 -f 函数 -x export declare -i n=0 ### 5.2 系统变量 $0 # 脚本启动名(包括路径) $n # 第n个参数,n=1,2,...9 $\* # 所有参数列表(不包括脚本本身) $@ # 所有参数列表(独立字符串) $# # 参数个数(不包括脚本本身) $$ # 当前程式的PID $! # 执行上一个指令的PID $? # 执行上一个指令的返回值 ### 5.3 变量引用技巧 ${name:+value} # 如果设置了name,就把value显示,未设置则为空 ${name:-value} # 如果设置了name,就显示它,未设置就显示value ${name:?value} # 未设置提示用户错误信息value ${name:=value} # 如未设置就把value设置并显示\<写入本地中\> ${#A} # 可得到变量中字节 ${#A\[\*\]} # 数组个数 ${A\[\*\]} # 数组所有元素 ${A\[@\]} # 数组所有元素(标准) ${A\[2\]} # 脚本的一个参数或数组第三位 ${A:4:9} # 取变量中第4位到后面9位 ${A/www/http} # 取变量并且替换每行第一个关键字 ${A//www/http} # 取变量并且全部替换每行关键字 定义了一个变量: file=/dir1/dir2/dir3/my.file.txt ${file#\*/} # 去掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##\*/} # 去掉最后一条 / 及其左边的字串:my.file.txt ${file#\*.} # 去掉第一个 . 及其左边的字串:file.txt ${file##\*.} # 去掉最后一个 . 及其左边的字串:txt ${file%/\*} # 去掉最后条 / 及其右边的字串:/dir1/dir2/dir3 ${file%%/\*} # 去掉第一条 / 及其右边的字串:(空值) ${file%.\*} # 去掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file ${file%%.\*} # 去掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my # # 是去掉左边(在键盘上 # 在 $ 之左边) # % 是去掉右边(在键盘上 % 在 $ 之右边) # 单一符号是最小匹配﹔两个符号是最大匹配 ## 6 test条件判断 # 符号 \[ \] 等同 test命令 expression为字符串操作{ -n str # 字符串str是否不为空 -z str # 字符串str是否为空 ### 6.1 expression为文件操作 -a # 并且,两条件为真 -b # 是否块文件 -p # 文件是否为一个命名管道 -c # 是否字符文件 -r # 文件是否可读 -d # 是否一个目录 -s # 文件的长度是否不为零 -e # 文件是否存在 -S # 是否为套接字文件 -f # 是否普通文件 -x # 文件是否可执行,则为真 -g # 是否设置了文件的 SGID 位 -u # 是否设置了文件的 SUID 位 -G # 文件是否存在且归该组所有 -w # 文件是否可写,则为真 -k # 文件是否设置了的粘贴位 -t fd # fd 是否是个和终端相连的打开的文件描述符(fd 默认为 1) -o # 或,一个条件为真 -O # 文件是否存在且归该用户所有 ! # 取反 ### 6.2 expression为整数操作 expr1 -a expr2 # 如果 expr1 和 expr2 评估为真,则为真 expr1 -o expr2 # 如果 expr1 或 expr2 评估为真,则为真 ### 6.3 两值比较 整数 字符串 -lt \< # 小于 -gt \> # 大于 -le \<= # 小于或等于 -ge \>= # 大于或等于 -eq == # 等于 -ne != # 不等于 test 10 -lt 5 # 判断大小 echo $? # 查看上句test命令返回状态 # 结果0为真,1为假 test -n "hello" # 判断字符串长度是否为0 \[ $? -eq 0 \] \&\& echo "success" \|\| exit # 判断成功提示,失败则退出 ## 7 重定向 # 标准输出 stdout 和 标准错误 stderr 标准输入stdin cmd 1\> fiel # 把 标准输出 重定向到 file 文件中 cmd \> file 2\>\&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中 cmd 2\> file # 把 标准错误 重定向到 file 文件中 cmd 2\>\> file # 把 标准错误 重定向到 file 文件中(追加) cmd \>\> file 2\>\&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中(追加) cmd \< file \>file2 # cmd 命令以 file 文件作为 stdin(标准输入),以 file2 文件作为 标准输出 cat \<\>file # 以读写的方式打开 file cmd \< file cmd # 命令以 file 文件作为 stdin cmd \<\< delimiter cmd; #从 stdin 中读入,直至遇到 delimiter 分界符 delimiter \>\&n # 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出 \<\&n # 标准输入复制自文件描述符 n \<\&- # 关闭标准输入(键盘) \>\&- # 关闭标准输出 n\<\&- # 表示将 n 号输入关闭 n\>\&- # 表示将 n 号输出关闭 ## 8 运算符 $\[\]等同于$(()) # $\[\]表示形式告诉shell求中括号中的表达式的值 \~var # 按位取反运算符,把var中所有的二进制为1的变为0,为0的变为1 var\\\<\\>str # 右移运算符,把var中所有的二进制位向右移动str位,忽略最右移出的各位,最左的各位上补0,每次做一次右移就有实现var除以2 var\&str # 与比较运算符,var和str对应位,对于每个二进制来说,如果二都为1,结果为1.否则为0 var\^str # 异或运算符,比较var和str对应位,对于二进制来说如果二者互补,结果为1,否则为0 var\|str # 或运算符,比较var和str的对应位,对于每个二进制来说,如二都该位有一个1或都是1,结果为1,否则为0 运算符优先级{ 级别 运算符 说明 1 =,+=,-=,/=,%=,\*=,\&=,\^=,\|=,\<\<=,\>\>== # 赋值运算符 2 \|\| # 逻辑或 前面不成功执行 3 \&\& # 逻辑与 前面成功后执行 4 \| # 按位或 5 \^ # 按异位与 6 \& # 按位与 7 ==,!= # 等于/不等于 8 \<=,\>=,\<,\> # 大于或等于/小于或等于/大于/小于 9 \\\<\<,\>\> # 按位左移/按位右移 (无转意符号) 10 +,- # 加减 11 \*,/,% # 乘,除,取余 12 ! ,\~ # 逻辑非,按位取反或补码 13 -,+ # 正负 ## 9 数学运算 $(( )) # 整数运算 + - \* / \*\* # 分別为 "加、減、乘、除、密运算" \& \| \^ ! # 分別为 "AND、OR、XOR、NOT" 运算 % # 余数运算 ### 9.1 let let # 运算 let x=16/4 let x=5\*\*5 ### 9.2 expr expr 14 % 9 # 整数运算 SUM=\`expr 2 \\\* 3\` # 乘后结果赋值给变量 LOOP=\`expr $LOOP + 1\` # 增量计数(加循环即可) LOOP=0 expr length "bkeep zbb" # 计算字串长度 expr substr "bkeep zbb" 4 9 # 抓取字串 expr index "bkeep zbb" e # 抓取第一个字符数字串出现的位置 expr 30 / 3 / 2 # 运算符号有空格 expr bkeep.doc : '.\*' # 模式匹配(可以使用expr通过指定冒号选项计算字符串中字符数) expr bkeep.doc : '\\(.\*\\).doc' # 在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名 #### 9.2.1 数值测试 #如果试图计算非整数,则会返回错误 rr=3.4 expr $rr + 1 expr: non-numeric argument rr=5 expr $rr + 1 6 ### 9.3 bc echo "m\^n"\|bc # 次方计算 seq -s '+' 1000 \|bc # 从1加到1000 seq 1 1000 \|tr "\\n" "+"\|sed 's/+$/\\n/'\|bc # 从1加到1000 ## 10 grep -c # 显示匹配到得行的数目,不显示内容 -h # 不显示文件名 -i # 忽略大小写 -l # 只列出匹配行所在文件的文件名 -n # 在每一行中加上相对行号 -s # 无声操作只显示报错,检查退出状态 -v # 反向查找 -e # 使用正则表达式 -A3 # 打印匹配行和下三行 -w # 精确匹配 -wc # 精确匹配次数 -o # 查询所有匹配字段 -P # 使用perl正则表达式 grep -v "a" txt # 过滤关键字符行 grep -w 'a\\\>' txt # 精确匹配字符串 grep -i "a" txt # 大小写敏感 grep "a\[bB\]" txt # 同时匹配大小写 grep '\[0-9\]\\{3\\}' txt # 查找0-9重复三次的所在行 grep -E "word1\|word2\|word3" file # 任意条件匹配 grep word1 file \| grep word2 \|grep word3 # 同时匹配三个 echo quan@163.com \|grep -Po '(?\<=@.).\*(?=.$)' # 零宽断言截取字符串 # 63.co echo "I'm singing while you're dancing" \|grep -Po '\\b\\w+(?=ing\\b)' # 零宽断言匹配 echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' \|grep -Po '(?\<=:).\*?(?=d)' # 取出d前面数字 # ?为最小匹配 echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' \| grep -Po '\[-0-9.\]+' # 取出d前面数字 # ?为最小匹配 echo '\["mem",ok\],\["hardware",false\],\["filesystem",false\]' \|grep -Po '\[\^"\]+(?=",false)' # 取出false前面的字母 echo '\["mem",ok\],\["hardware",false\],\["filesystem",false\]' \|grep -Po '\\w+",false'\|grep -Po '\^\\w+' # 取出false前面的字母 grep用于if判断{ if echo abc \| grep "a" \> /dev/null 2\>\&1 then echo "abc" else echo "null" fi ## 11 tr -c # 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII -d # 删除字符串1中所有输入字符 -s # 删除所有重复出现字符序列,只保留第一个:即将重复出现字符串压缩为一个字符串 \[a-z\] # a-z内的字符组成的字符串 \[A-Z\] # A-Z内的字符组成的字符串 \[0-9\] # 数字串 \\octal # 一个三位的八进制数,对应有效的ASCII字符 \[O\*n\] # 表示字符O重复出现指定次数n。因此\[O\*2\]匹配OO的字符串 tr中特定控制字符表达方式{ \\a Ctrl-G \\007 # 铃声 \\b Ctrl-H \\010 # 退格符 \\f Ctrl-L \\014 # 走行换页 \\n Ctrl-J \\012 # 新行 \\r Ctrl-M \\015 # 回车 \\t Ctrl-I \\011 # tab键 \\v Ctrl-X \\030 tr A-Z a-z # 将所有大写转换成小写字母 tr " " "\\n" # 将空格替换为换行 tr -s "\[\\012\]" \< plan.txt # 删除空行 tr -s \["\\n"\] \< plan.txt # 删除空行 tr -s "\[\\015\]" "\[\\n\]" \< file # 删除文件中的\^M,并代之以换行 tr -s "\[\\r\]" "\[\\n\]" \< file # 删除文件中的\^M,并代之以换行 tr -s "\[:\]" "\[\\011\]" \< /etc/passwd # 替换passwd文件中所有冒号,代之以tab键 tr -s "\[:\]" "\[\\t\]" \< /etc/passwd # 替换passwd文件中所有冒号,代之以tab键 echo $PATH \| tr ":" "\\n" # 增加显示路径可读性 1,$!tr -d '\\t' # tr在vi内使用,在tr前加处理行范围和感叹号('$'表示最后一行) tr "\\r" "\\n"\ unixfile # Mac -\> UNIX tr "\\n" "\\r"\ macfile # UNIX -\> Mac tr -d "\\r"\ unixfile # DOS -\> UNIX Microsoft DOS/Windows 约定,文本的每行以回车字符(\\r)并后跟换行符(\\n)结束 awk '{ print $0"\\r" }'\ dosfile # UNIX -\> DOS:在这种情况下,需要用awk,因为tr不能插入两个字符来替换一个字符 ## 12 seq # 不指定起始数值,则默认为 1 -s # 选项主要改变输出的分格符, 预设是 \\n -w # 等位补全,就是宽度相等,不足的前面补 0 -f # 格式化输出,就是指定打印的格式 seq 10 100 # 列出10-100 seq 1 10 \|tac # 倒叙列出 seq -s '+' 90 100 \|bc # 从90加到100 seq -f 'dir%g' 1 10 \| xargs mkdir # 创建dir1-10 seq -f 'dir%03g' 1 10 \| xargs mkdir # 创建dir001-010 ## 13 trap 信号 说明 HUP(1) # 挂起,通常因终端掉线或用户退出而引发 INT(2) # 中断,通常因按下Ctrl+C组合键而引发 QUIT(3) # 退出,通常因按下Ctrl+\\组合键而引发 ABRT(6) # 中止,通常因某些严重的执行错误而引发 ALRM(14) # 报警,通常用来处理超时 TERM(15) # 终止,通常在系统关机时发送 trap捕捉到信号之后,可以有三种反应方式: 1、执行一段程序来处理这一信号 2、接受信号的默认操作 3、忽视这一信号 第一种形式的trap命令在shell接收到 signal list 清单中数值相同的信号时,将执行双引号中的命令串: trap 'commands' signal-list # 单引号,要在shell探测到信号来的时候才执行命令和变量的替换,时间一直变 trap "commands" signal-list # 双引号,shell第一次设置信号的时候就执行命令和变量的替换,时间不变 ## 14 awk # 默认是执行打印全部 print $0 # 1为真 打印$0 # 0为假 不打印 -F # 改变FS值(分隔符) \~ # 域匹配 == # 变量匹配 !\~ # 匹配不包含 = # 赋值 != # 不等于 += # 叠加 \\b # 退格 \\f # 换页 \\n # 换行 \\r # 回车 \\t # 制表符Tab \\c # 代表任一其他字符 -F"\[ \]+\|\[%\]+" # 多个空格或多个%为分隔符 \[a-z\]+ # 多个小写字母 \[a-Z\] # 代表所有大小写字母(aAbB...zZ) \[a-z\] # 代表所有大小写字母(ab...z) \[:alnum:\] # 字母数字字符 \[:alpha:\] # 字母字符 \[:cntrl:\] # 控制字符 \[:digit:\] # 数字字符 \[:graph:\] # 非空白字符(非空格、控制字符等) \[:lower:\] # 小写字母 \[:print:\] # 与\[:graph:\]相似,但是包含空格字符 \[:punct:\] # 标点字符 \[:space:\] # 所有的空白字符(换行符、空格、制表符) \[:upper:\] # 大写字母 \[:xdigit:\] # 十六进制的数字(0-9a-fA-F) \[\[:digit:\]\[:lower:\]\] # 数字和小写字母(占一个字符) ### 14.1 内建变量 $n # 当前记录的第 n 个字段,字段间由 FS 分隔 $0 # 完整的输入记录 ARGC # 命令行参数的数目 ARGIND # 命令行中当前文件的位置 ( 从 0 开始算 ) ARGV # 包含命令行参数的数组 CONVFMT # 数字转换格式 ( 默认值为 %.6g) ENVIRON # 环境变量关联数组 ERRNO # 最后一个系统错误的描述 FIELDWIDTHS # 字段宽度列表 ( 用空格键分隔 ) FILENAME # 当前文件名 FNR # 同 NR ,但相对于当前文件 FS # 字段分隔符 ( 默认是任何空格 ) IGNORECASE # 如果为真(即非 0 值),则进行忽略大小写的匹配 NF # 当前记录中的字段数(列) NR # 当前行数 OFMT # 数字的输出格式 ( 默认值是 %.6g) OFS # 输出字段分隔符 ( 默认值是一个空格 ) ORS # 输出记录分隔符 ( 默认值是一个换行符 ) RLENGTH # 由 match 函数所匹配的字符串的长度 RS # 记录分隔符 ( 默认是一个换行符 ) RSTART # 由 match 函数所匹配的字符串的第一个位置 SUBSEP # 数组下标分隔符 ( 默认值是 /034) BEGIN # 先处理(可不加文件参数) END # 结束时处理 ### 14.2 内置函数 gsub(r,s) # 在整个$0中用s替代r 相当于 sed 's///g' gsub(r,s,t) # 在整个t中用s替代r index(s,t) # 返回s中字符串t的第一位置 length(s) # 返回s长度 match(s,r) # 测试s是否包含匹配r的字符串 split(s,a,fs) # 在fs上将s分成序列a sprint(fmt,exp) # 返回经fmt格式化后的exp sub(r,s) # 用$0中最左边最长的子串代替s 相当于 sed 's///' substr(s,p) # 返回字符串s中从p开始的后缀部分 substr(s,p,n) # 返回字符串s中从p开始长度为n的后缀部分 ### 14.3 awk判断 awk '{print ($1\>$2)?"第一排"$1:"第二排"$2}' # 条件判断 括号代表if语句判断 "?"代表then ":"代表else awk '{max=($1\>$2)? $1 : $2; print max}' # 条件判断 如果$1大于$2,max值为为$1,否则为$2 awk '{if ( $6 \> 50) print $1 " Too high" ;\\ else print "Range is OK"}' file awk '{if ( $6 \> 50) { count++;print $3 } \\ else { x+5; print $2 } }' file ### 14.4 awk循环 awk '{i = 1; while ( i \<= NF ) { print NF, $i ; i++ } }' file awk '{ for ( i = 1; i \<= NF; i++ ) print NF,$i }' file awk '/Tom/' file # 打印匹配到得行 awk '/\^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段 awk '$1 !\~ /ly$/' # 显示所有第一个字段不是以ly结尾的行 awk '$3 \<40' # 如果第三个字段值小于40才打印 awk '$4==90{print $5}' # 取出第四列等于90的第五列 awk '/\^(no\|so)/' test # 打印所有以模式no或so开头的行 awk '$3 \* $4 \> 500' # 算术运算(第三个字段和第四个字段乘积大于500则显示) awk '{print NR" "$0}' # 加行号 awk '/tom/,/suz/' # 打印tom到suz之间的行 awk '{a+=$1}END{print a}' # 列求和 awk 'sum+=$1{print sum}' # 将$1的值叠加后赋给sum awk '{a+=$1}END{print a/NR}' # 列求平均值 awk -F'\[ :\\t\]' '{print $1,$2}' # 以空格、:、制表符Tab为分隔符 awk '{print "'"$a"'","'"$b"'"}' # 引用外部变量 awk '{if(NR==52){print;exit}}' # 显示第52行 awk '/关键字/{a=NR+2}a==NR {print}' # 取关键字下第几行 awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替换后的行 ll \| awk -F'\[ \]+\|\[ \]\[ \]+' '/\^$/{print $8}' # 提取时间,空格不固定 awk '{$1="";$2="";$3="";print}' # 去掉前三列 echo aada:aba\|awk '/d/\|\|/b/{print}' # 匹配两内容之一 echo aada:abaa\|awk -F: '$1\~/d/\|\|$2\~/b/{print}' # 关键列匹配两内容之一 echo Ma asdas\|awk '$1\~/\^\[a-Z\]\[a-Z\]$/{print }' # 第一个域匹配正则 echo aada:aaba\|awk '/d/\&\&/b/{print}' # 同时匹配两条件 awk 'length($1)=="4"{print $1}' # 字符串位数 awk '{if($2\>3){system ("touch "$1)}}' # 执行系统命令 awk '{sub(/Mac/,"Macintosh",$0);print}' # 用Macintosh替换Mac awk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一个域内用Macintosh替换Mac awk -F '' '{ for(i=1;i\a) a=$1 fi}END{print a}' # 列求最大值 设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束 awk 'BEGIN{a=11111}{if ($1\= 0 ) {print $0,$i}}' # 求余数 awk '{b=a;a=$1; if(NR\>1){print a-b}}' # 当前行减上一行 awk '{a\[NR\]=$1}END{for (i=1;i\<=NR;i++){print a\[i\]-a\[i-1\]}}' # 当前行减上一行 awk -F: '{name\[x++\]=$1};END{for(i=0;i\ /dev/null 2\>\&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a # 执行系统命令判断返回状态 awk '{for(i=1;i\<=NF;i++) a\[i,NR\]=$i}END{for(i=1;i\<=NF;i++) {for(j=1;j\<=NR;j++) printf a\[i,j\] " ";print ""}}' # 将多行转多列 awk 'BEGIN{printf "what is your name?";getline name \< "/dev/tty" } $1 \~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file # 两文件匹配 cat 1.txt\|awk -F" # " '{print "insert into user (user,password,email)values(""'\\''"$1"'\\'\\,'""'\\''"$2"'\\'\\,'""'\\''"$3"'\\'\\)\\;'"}' \>\>insert_1.txt # 处理sql语句 ### 14.5 取本机IP /sbin/ifconfig \|awk -v RS="Bcast:" '{print $NF}'\|awk -F: '/addr/{print $2}' /sbin/ifconfig \|awk -v RS='inet addr:' '$1!="eth0"\&\&$1!="127.0.0.1"{print $1}'\|awk '{printf"%s\|",$0}' /sbin/ifconfig \|awk '{printf("line %d,%s\\n",NR,$0)}' # 指定类型(%d数字,%s字符) ### 14.6 查看磁盘空间 df -h\|awk -F"\[ \]+\|%" '$5\>14{print $5}' df -h\|awk 'NR!=1{if ( NF == 6 ) {print $5} else if ( NF == 5) {print $4} }' df -h\|awk 'NR!=1 \&\& /%/{sub(/%/,"");print $(NF-1)}' df -h\|sed '1d;/ /!N;s/\\n//;s/ \\+/ /;' #将磁盘分区整理成一行 可直接用 df -P ### 14.7 排列打印 awk 'END{printf "%-10s%-10s\\n%-10s%-10s\\n%-10s%-10s\\n","server","name","123","12345","234","1234"}' txt awk 'BEGIN{printf "\|%-10s\|%-10s\|\\n\|%-10s\|%-10s\|\\n\|%-10s\|%-10s\|\\n","server","name","123","12345","234","1234"}' awk 'BEGIN{ print " \*\*\* 开 始 \*\*\* "; print "+-----------------+"; printf "\|%-5s\|%-5s\|%-5s\|\\n","id","name","ip"; } $1!=1 \&\& NF==4{printf "\|%-5s\|%-5s\|%-5s\|\\n",$1,$2,$3" "$11} END{ print "+-----------------+"; print " \*\*\* 结 束 \*\*\* " }' txt

相关推荐
小魏冬琅11 分钟前
探索面向对象的高级特性与设计模式(2/5)
java·开发语言
lihao lihao13 分钟前
C++stack和queue的模拟实现
开发语言·c++
就爱敲代码16 分钟前
怎么理解ES6 Proxy
1024程序员节
憧憬一下16 分钟前
input子系统的框架和重要数据结构详解
arm开发·嵌入式·c/c++·1024程序员节·linux驱动开发
TT哇25 分钟前
【Java】数组的定义与使用
java·开发语言·笔记
三日看尽长安花25 分钟前
【Tableau】
1024程序员节
天天进步201530 分钟前
Lodash:现代 JavaScript 开发的瑞士军刀
开发语言·javascript·ecmascript
假装我不帅39 分钟前
js实现类似与jquery的find方法
开发语言·javascript·jquery
well_fly39 分钟前
Ubuntu特殊目录
linux·ubuntu
look_outs43 分钟前
JavaSE笔记2】面向对象
java·开发语言