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) <love

> # 词尾定位符(支持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,并捕获文本到自动命名的组里

(?<name>exp) # 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

(?:exp) # 匹配exp,不捕获匹配的文本,也不给此分组分配组号

3.5 零宽断言

(?=exp) # 匹配exp前面的位置

(?<=exp) # 匹配exp后面的位置

(?!exp) # 匹配后面跟的不是exp的位置

(?<!exp) # 匹配前面不是exp的位置

(?#comment) # 注释不对正则表达式的处理产生任何影响,用于注释

3.6 特殊字符

^H \010 \b

^M \015 \r

匹配特殊字符: ctrl+V ctrl不放在按H或M 即可输出^H,用于匹配

4 流程结构

4.1 if判断

if $a == $b

then

echo "等于"

else

echo "不等于"

fi

4.2 case分支选择

case $xs in

  1. echo "0" ;;

  2. echo "1" ;;

*) echo "其他" ;;

esac

4.3 while循环

while true 等同 while :

读文件为整行读入

num=1

while $num -lt 10

do

echo $num

((num=$num+2))

done

###########################

grep a a.txt | while read a

do

echo $a

done

###########################

while read a

do

echo $a

done < a.txt

4.4 for循环

读文件已空格分隔

w=`awk -F ":" '{print $1}' c`

for d in $w

do

$d

done

###########################

for ((i=0;i<${#o\*};i++))

do

echo {o\[i]}

done

4.5 until循环

当command不为0时循环

until command

do

body

done

4.6 流程控制

break N # 跳出几层循环

continue N # 跳出几层循环,循环次数不变

continue # 重新循环次数不变

5 变量

A="a b c def" # 将字符串复制给变量

A=`cmd` # 将命令结果赋给变量

A=$(cmd) # 将命令结果赋给变量

eval a=\$$a # 间接调用

i=2&&echo $((i+3)) # 计算后打印新变量结果

i=2&&echo $i+3 # 计算后打印新变量结果

a=$((2>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@} # 数组所有元素(标准)

${A2} # 脚本的一个参数或数组第三位

${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位,忽略最右移出的各位,最左的各位上补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 "abB" 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"<macfile > unixfile # Mac -> UNIX

tr "\n" "\r"<unixfile > macfile # UNIX -> Mac

tr -d "\r"<dosfile > unixfile # DOS -> UNIX Microsoft DOS/Windows 约定,文本的每行以回车字符(\r)并后跟换行符(\n)结束

awk '{ print $0"\r" }'<unixfile > 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<NF+1;i++)a+=$i ;print a}' # 多位数算出其每位数的总和.比如 1234, 得到 10

awk '{ i=1%10;if ( i == 0 ) {print i}}' # 判断1是否整除(awk中定义变量引用时不能带 $ )

awk 'BEGIN{a=0}{if (1\>a) a=1 fi}END{print a}' # 列求最大值 设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束

awk 'BEGIN{a=11111}{if (1\1 fi}END{print a}' # 求最小值

awk '{if(A)print;A=0}/regexp/{A=1}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行

awk '/regexp/{print A}{A=$0}' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行

awk '{if(!/mysql/)gsub(/1/,"a");print $0}' # 将1替换成a,并且只在行中未出现字串mysql的情况下替换

awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 获取随机数

awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}' # 从第3行开始,每7行显示一次

awk '{if(NF<1){print i;i=0} else {i++;print $0}}' # 显示空行分割各段的行数

echo +null:null |awk -F: '1!\~"\^+"\&\&2!="null"{print $0}' # 关键列同时匹配

awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if(i) printf i;print ""}' # 指定记录分隔符

awk '{b$1=b$1$2}END{for(i in b){print i,bi}}' # 列叠加

awk '{ i=(1%100);if ( i >= 0 ) {print 0,i}}' # 求余数

awk '{b=a;a=$1; if(NR>1){print a-b}}' # 当前行减上一行

awk '{aNR=$1}END{for (i=1;i<=NR;i++){print ai-ai-1}}' # 当前行减上一行

awk -F: '{namex++=$1};END{for(i=0;i<NR;i++)print i,namei}' # END只打印最后的结果,END块里面处理数组内容

awk '{sum2+=2;count=count+1}END{print sum2,sum2/count}' # 2的总和 $2总和除个数(平均值)

awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon2}' file # 将date值赋给d,并将d设置为数组mon,打印mon数组中第2个元素

awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 截取字符串(substr使用)

awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' # 匹配字符串(index使用)

awk 'BEGIN{info="this is a test2010test!";print match(info,/0-9+/)?"ok":"no found";}' # 正则表达式匹配查找(match使用)

awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tAk;}}' # 字符串分割(split使用)

awk '{for(i=1;i<=4;i++)printf i""FS; for(y=10;y\<=13;y++) printf y""FS;print ""}' # 打印前4列和后4列

awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}' # 乘法口诀

awk '{if (system ("grep "2" tmp/\* \> /dev/null 2\>\&1") == 0 ) {print 1,"Y"} else {print $1,"N"} }' a # 执行系统命令判断返回状态

awk '{for(i=1;i<=NF;i++) ai,NR=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf ai,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

相关推荐
z落落几秒前
C# 泛型方法(原理、类型推断、多泛型参数)+泛型效率(普通类型 VS Object装箱 VS 泛型)
开发语言·c#
L_09072 分钟前
【C++】异常
开发语言·c++
AOwhisky30 分钟前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
Phantom Void41 分钟前
服务器处理客户端请求的设计方法
linux·运维·网络
倔强的石头1061 小时前
Fooocus开源神器+cpolarAI让绘画告别服务器依赖
运维·服务器·cpolar
wei_shuo1 小时前
服务器挂了等用户投诉才发现?我用Beszel搭了轻量监控系统,宕机第一时间通知我
运维·服务器
王码码20351 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web
一段路1 小时前
【虚拟机】Linux常用命令
linux·vim
世辰辰辰1 小时前
批量修改图片/文本名子
开发语言·python·批量修改文件名
daad7772 小时前
继续记录无人机SITL的起飞
linux