【shell笔记】Linux Shell脚本编程入门知识点全面涵盖

本文是我对白树明老师shell课程笔记的总结,课程链接:https://www.bilibili.com/video/BV1j541157Sr?from=search&seid=9757674743771615780

一:shell是什么?生成shell脚本

shell是什么?

1 shell是一个程序,采用C语言编写,是用户和Linux内核沟通的桥梁。
2 shell脚本就是将完成一个任务的所有命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。它能实现很多功能:如输出:echo “hello world” ;如通过管道将world替换为亲:echo “hello world”|sed ‘s/world/亲’

生成shell脚本

1 抒写shell脚本 vim 1.sh
.

二:shell脚本语法规范

shell脚本语法规范1

1 起名要有意义,开头要定义脚本的执行环境 #!/bin/bash 要注意这里“#!”不是注释的意思!没有找到这个执行环境会报错
2 完善脚本信息
#Author:
#Created Time: 2021/8/4
#Release:1.0
#Script Description: 功能
3 脚本组成
3.1 解释环境如#!/bin/env bash |python|perl
3.2 注释说明
3.3 执行代码
4 运行shell脚本有两种方法
4.1 给执行权限chomd 700 1.sh
4.2 解释器直接运行,不需要给权限。如bash 1.sh或者sh 1.sh 可以通过cat /etc/shells查看很多比如/bin/sh,不过推荐解释环境是什么就用什么。
5 特殊符号
5.1 **cd ~表示回到家目录,而cd -**代表回到上一级目录
5.2 !+首字母=执行历史命令 !!代表执行上一条命令
5.3 $ 变量中取内容符
5.4 + - * / % 分别对应加减乘除取余
5.5 & 后台执行
5.6 * shell中的通配符,匹配所有
5.7 ?shell中的通配符,匹配除回车以外的一个字符
5.8 ; 在shell中一行执行多个命令,命令之间用分号分隔
5.9 | 管道符 上一个命令输出作为下一个命令输入 cat filename | grep “abc”
5.10 \ 转义字符
5.11 `` 反引号 命令中执行命令 echo “today is `date +%F`”
5.12 ‘’ 将字符串引起来但是不解释变量
5.13 “” 将字符串引起来,能解释变量,但是两个单引号‘‘’’就可以解释变量了

shell脚本语法规范2

1 | 管道符在shell中用的最多,上一个命令输出作为下一个命令输入。如cat /etc/passwd | grep “root” 意思是把“cat /etc/passwd”命令的输入通过管道输给“grep”,grep检索以后把结果再输出到屏幕。
2 输入:echo haha > ./text.txt echo haha >> ./text.txt 第二种不会覆盖之前输出的
3 输出:wc < text.txt 统计的是数据流,得到4 4 20 分别为4行4个单词20个字节。 wc text.txt 统计的是文本,输出为4 4 20 text.txt。<<为追加输出,例如fdisk /dev/sdb/ <<EOF … EOF 把交互的东西输入进去,直接运行不用手动输入即可得到输出。
4 数学运算
4.1 expr命令只能做整数运算,要注意空格。
加:expr 1+2 减 - 乘 * 除 / 取余 % ,用$?判断上一条命令能否执行成功,如果返回值为0则执行成功(echo $?)
例子:expr 7 + 1.1 &>/dev/null ; echo $? 意思是“expr 7 + 1.1”命令输出的结果不管对的还是错的都输出到/dev/null,它指的是系统的回收站
4.2 let也是对整数做运算,需要赋值
let sum=1+1; echo $sum
4.3 bc 提供的一个计算器,设置scale=2,意思是小数点保留2位,这个是交互的计算机。
4.4 例子:echo “当前内存使用率:`echo “scale=2;141*100/7966|bc”`%”
计算内存的使用率:里面的echo用于运算,外面的echo用于输出。将计算通过管道输入到bc中得到结果。
4.5 echo $(( )) 双小圆括号加美元符可以做运算。
5 exit退出脚本:注意它的返回值的设置范围是1-255
.

三:shell脚本输出与输入

shell格式化输出

1 echo:将内容输出到默认显示设备 语法:echo [-ne][字符串]
-n不要再最后自动换行
-e若字符串中出现转义字符,则做特殊处理。
\a喇叭发生
\t表示一个tab键
\n代表回车
\b删除一个字符如echo -n -e “a\b”输出为空

#倒计时代码
for time in `seq 9 -1 0`;do
	echo -n -e “\b$time”
	sleep 1
done
#echo后面什么都不写会输出一个空行。

2 颜色
echo -e “\033[背景色; 字体颜色 字符串 \033[属性效果” 效果包括下划线、高亮、闪烁等。
例子:echo -e “\033[40;37m 哈哈哈哈哈 \033[4m” 黑底白字下划线

shell基本输入

1 read:默认接受键盘输入,回车符代表输入结束
-p打印信息
-t限定时间
-s不显示输入
-n输入字符个数,超过后就截断。

#登录界面代码
#!/bin/bash
clear #整个屏幕清空
#echo -n -e “Login:”
#read acc
read -p “Login:” acc  #上面两行代码可以用这一行代码代替

echo -n -e “Password:”
read -s -t50 -n6 pw
echo
echo “account: $acc   password: $pw  ”

.

四:shell变量

shell变量类型

1 三类变量:
1.1 本地变量(用户私有变量,只有本用户可使用,保存在家目录下的.bash_profile、.bashrc文件中)1.2 全局变量(所有用户都可使用,保存在/etc/profile、/etc/bashrc文件中)
1.3 用户自定义变量(用户自定义,比如脚本中的变量)
前两个变量会存在到从开机到关机,用户自定义变量脚本结束以后就没了。

shell变量管理

1 定义变量:注意变量名与等号之间不能有空格。命名不能以数字开头(数字、下划线、字母),变量不可中间包含空格。字符串要用单引号或者双引号引起来。
2 读取变量:方法:用$读取。
3 取消临时变量 unset a
4 定义全局变量:加上export变量才会变成全局变量,否则只是本地变量。
5 定义永久变量:写在配置文件里就是永久变量,写在终端里面就是临时变量。
.

五:shell数组

1 基本数组:可以让用户一次赋予多个值,需要读取数据时只需通过索引调用就可方便读出。
用法:数组名=(元素1 元素2 元素3 … ) 例如ARRAY1=(‘a’ ‘b’ ‘c’ ‘d’)
读取:echo ${ARRAY1[2]}
赋值:ARRAY1[3]=’E’
2 查看数组
2.1查看声明过的数组:declare -a
2.2 查看自定义的数组:
echo ${ARRAY1[@]} 访问数组中所有元素 等同于echo ${ARRAY1[*]}
echo ${#ARRAY1[@]} 统计数组中元素个数
echo ${!ARRAY1[@]} 获取数组的全部索引
echo ${ARRAY1[@]:2} 从第二个开始全部打印
echo ${ARRAY1[@]:2:4} 从第二个开始打印四个元素
3 关联数组(关联数组的索引是自定义的,而基本数组索引是0 1 2 3 4开始的)
3.1 声明数组:declare -A acc_array1 (如果不声明,它就是基本数组)
3.2 一次赋一个值acc_array1[name]=’amao’ acc_array1[age]=18
3.3 或者一次赋多个值 acc_array2=([name]=’amao’ [age]=18)
.

六:shell运算

shell数据比较运算

1 shell的五大运算
-eq 等于 -gt 大于 -lt 小于 -ge大于或等于 -le 小于或等于 -ne 不等于
例子:test 1 -eq 1;echo $? 输出0,表示执行成功为0,这和c语言是相反的。test可以用来做判断。
浮点数如何比较?放大去处理,放到成整型。如:
NUM1=`echo “1.5*10”|bc|cut -d “.” -f1`
NUM2=$((2*10))
test $NUM1 -gt $NUM2;echo $?
bash -x _1.sh
-x可以查看debug的过程

文件类型判断

1 文件比较与检查
-d 判断目录是否存在 如:test -d /tmp/abc; echo $? 返回值为1证明不存在,创建:mkdir /tmp/abc
-e 检查文件或目录是否存在 如:test -e /tmp/abc; echo $?
-f 判断文件是否存在,只能判断文件!
-r 检查文件是否存在且可读,要注意root(管理员权限)即使在设置了不可见也是可读的
-s 检查文件是否存在且不为空
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-O 检查文件是否存在且被当前用户拥有
-G 检查文件是否存在且默认组为当前用户组
-nt 文件1比文件2新 如:test float.sh -nt /tmp/baism; echo $?
-ot 文件1比文件2旧
-ef 文件1与文件2属于同一个文件(这个比较的是i节点是否相同)
通过man test可以查看test的一些用法和参数

其他运算

1 字符串比较运算
== 等于 != 不等于 -n 检查字符串是否不为空(长度大于0) -z 是否为空(长度等于0)
如test $USER == ‘root’; echo $?
2 赋值运算
= 如a=10
3 逻辑运算
与&& 或|| 非!
如:if [ 1 -eq 1 ] && [ 2 -eq 2 ]; then echo “yes”; else echo “no”; fi
.

七:if语法

1 语法1:单if语句格式

if [ condition ] 
	then
		commands
fi 
#假如没有这个文件夹/目录,就生成
if [ ! -d /tmp/abc ]
	then 
		mkdir -v /tmp/abc
		echo “123” 
		echo “create /tmp/abc ok” 
fi

2 语法2:if-then-else语句格式

if [ condition ] 
	then
		commands1
else
		commands2
fi 

3 语法3:if-then-elif语句格式

if [ condition1 ] 
	then
		commands1
elif [ condition2 ]
		commands2
 ...
else
		commandsx
fi 

一个新知识:$可以给脚本传参。
4 if高级用法:双圆括号可以进行数学运算,双方括号可以做字符串匹配。

if (( 100%3+1>1 )); then
	echo “yes”
else
	echo “no”
fi
for var in ab ac rx rvv
	do
		if [[ “$var” == r* ]]
			then
				echo “$var”
		fi
done

.

八:for语法

1 for语法1格式

for var in value1 value2 ...
	do
		commands
done

例子:

for i in `seq 1 9`
	do
		echo $i
done
#seq 1 9 输出为1到9
#seq 9 -1 1 输出为9到1
#seq 9 -3 1 输出为9 6 3

2 for语法2格式

#一个例子
for ((i=1; i<10; i++))
	do
		echo $i
done
#多个变量例子
for (( a=0, b=9; a<10; a++, b-- ))
	do
		echo $a $b
done

无限循环:for (( ;; ))
同时字符串也可以赋值用于循环,但是要\注意转义
.

九:shell循环控制

循环控制语句

1.1 sleep N 脚本执行到该步休眠N秒

#ping一个ip
for ((;;))
	do
		ping -c1 $1 &>/dev/null  #ping一个ip,ip通过$1参数传过来,得到的结果直接送进垃圾桶
		if [ $? -eq 0 ]   #如果上一步执行成功
			then
				echo “`date + “%F %H:%M:%S”`: $1 is \033[32m UP \033[0m”  #UP为绿色
		else
				echo “`date + “%F %H:%M:%S”`: $1 is \033[31m Down \033[0m”  #down为红色
		fi
		#脚本节奏控制 生成环境建议1分钟及以上
		sleep 5
done

1.2 continue跳出某次循环
1.3 break跳出循环

#输入一个字母,当输入Q时退出
for ((;;))
	do
		read -p “char:” ch
		if [ $ch == “Q” ]
			then
				break
		else
				echo “你输入的字符是:$ch”
done

多层循环时break并不是跳出全部循环!如果循环多层嵌套,循环从里往外排序0-N,如果想跳出某层循环,就使用break N
.

十:while循环语法

while语法

condition可以是五种运算(数学比较、字符串比较、文件类型、逻辑运算、赋值运算)中的任意一种

while [ condition ]
	do
		commands
done
#一个例子
read -p “a:” a
read -p “b:” b
read -p “c:” c
while [ $a -lt 10 ] || [ $b -lt 2 ] || [$c -lt 3]
	do
		echo “no”
		read -p “a:” a
		read -p “b:” b
		read -p “c:” c
done
echo “Sure”
调用:bash one.sh 5 7 5

while循环控制与语句嵌套

1 嵌套:if for while
2 循环控制:sleep break continue

#输出12345
a1{
i=1
while [ $i -lt 10 ]
	do
		echo $i
		if [ $i -eq 5 ]; then
			break
		fi
		i=$((i+1))
done
}
#99乘法表
a2{
n=1
while [ $i -lt 10 ]; do
	for ((m=1; m<=$n; m++)); do
		echo -n -e “$m * $n = $((n*m))\t”
	done
	echo
	n=$((n+1))
done
}

.

十一:until循环语法

1 介绍:与while相反,until是条件为假开始执行,条件为真时停止执行。
2 语法

until [ condition ]
	do
		commands
done
#打印10到20
i=10
until [ $i -gt 20 ]; do
	echo $i
	i = $((i+1))
done

.

十二:case语句

1 语法:每个代码块执行完毕要以;;结尾代表结束。

case 变量 in
条件1)
	执行代码块1
;;
条件2)
	执行代码块2
;;
...
esac

2 shell特殊变量
2.1 $0 脚本名字
2.2 $* 脚本参数
2.3 $# 传参数量
2.4 $$ 脚本执行进程号
2.5 $_ 最后执行命令
2.6 $2 输出第2个参数
.

十三:shell函数介绍

1 语法1:

函数名() {
	代码块
	return N #执行成功返回几
}

2 语法2:

function 函数名 {
	代码块
	return N
}
#nginx启动管理脚本实战
#这只是一个简单的框架
start() {
}
stop() {
}
restart() {
}
reload() {
}
status() {
}
case $1 in
start) start;;
stop) stop;;
restart) restart;;
reload) reload;;
status) status;;
*) echo “USAGE: $0 start|stop|restart|reload|status”;;
esac

.

十四:正则表达式_grep

正则表达式之特殊字符

1 介绍:正则表达式是一种文本模式匹配,可以检查字符串中是否含有某种子串、将匹配的子串替换或从某个字符串中取出某个条件子串。shell支持正则表达式,但不是所有命令都支持,常见命令中只有grep、sed、awk命令支持正则表达式。
2 特殊字符:^锚定开头,^a意思是以a开头。 $锚定结尾,a$意思是以a结尾。
两个字符一起使用是精确匹配,如果只用一个是模糊匹配
egrep等价于grep -E
eprep “^ac$” file 指的是匹配以a开头以c结尾的文件,这是精确匹配。
3 字符串匹配
3.1 .匹配除回车外的任意一个字母 如egrep “^a.c$” file等用于 egrep “^a[]c$” file
3.2 ()字符串分组
3.3 []也是匹配一个字节,但它可以指定匹配的范围,如egrep “^a[0-9]c$” file
3.4 [^]取反。egrep “^a[^0-9]c$” file在里面加一个^表示取反,取除了0-9以外的。
3.5 \转义字符,如egrep “^a\*c$” file可以检索到a*c
3.6 |管道,分组,如egrep “^(a|b)c$” file以a或者b开头,c结尾的字符串。
4 限定符,对前面字符或者字符串做限定说明。
4.1 *出现在字符后代表该字符可以不出现或者出现多次,如egrep “^ab*c$” file结果为ac\abbc\abbbbc\abc
4.2 ?出现在字符后代表该字符可以不出现或者只出现一次,如egrep “^ab?c$” file结果为ac\abc
4.3 +出现在字符后代表该字符至少出现一次或多次,如egrep “^ab+c$” file结果为abbc\abbbbc\abc
4.4 {n,m} n代表某字符至少出现多少次,m代表最多出现多少次。如egrep “^ab{2,4}c$” file结果为abbc\abbbc\abbbbc
4.5 {m}代表正好出现了m次。如egrep “^ab{2}c$” file结果为abbc

正则表达式之POSIX字符

1 POSIX特殊字符
[:alnum:]匹配任意字符0-9 a-z A-Z
egrep “^a[[:alnum:]]c$” file第一个中括号代表匹配一个字节,第二个中括号代表匹配的格式。
[:alpha:]匹配任意字母,大写或小写
[:digit:]数字0-9
等等
结合使用:egrep “^a[[:alnum:]]*c$” file

#匹配ip地址:
egrep ‘^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$’ --color ip_base
#分析:ip范围是250-255\200-249\0-199

.

十五:shell对文件操作_sed

sed介绍

1 介绍:对文件的增删改查用vim可以做,但是它是交互式的,而脚本无法交互式。所以sed命令可以直接对文本进行操作而不需要交互。
2 sed命令:是一个行编辑器(编辑对象是文件中的行),非交互式的对文件内容进行增删改查的操作。如果处理大文件,最好避免用vim直接打开,因为内存占用很大,所以用行编辑器去处理比较好。
sed默认不会对源文件进行修改,它是读取一行以后在缓存中处理然后输出到屏幕。如果想让sed对源文件修改就要加特殊的命令选项。

sed格式

sed [options] ‘{command}[flags]’ [filename]
command是对文件做什么,也就是增删改查。
命令选项:
-e script 将脚本中指定命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n 抑制自动输出
-i 编辑文件内容
-i.bak 修改时同时创建.bak备份文件
-r 使用扩展的正则表达式
! 取反(跟在模式条件后与shell有所区别)
sed常用内部命令
a 在匹配后面添加【增】
i 在匹配前面添加【增】
p 打印【查】
d 删除【删】
s 查找替换【改】
c 更改【改】
y 转换 N D P【改】
flags:
数字 表示新文本替换的模式
g 表示用新文本替换现有文本的全部实例
p 表示打印原始的内容
w filename 将替换的结果写入文件

用法实例

1 sed常用内部命令例子

后面追加:
sed ‘ahello world’ data每行后面都插入hello world   或者sed ‘a\hello world’ data也可
sed ‘2,3a\hello world’ data在第二、三行后面插入hello world
上述操作并不会对源文件进行修改
sed ‘/aba 2/a\hello world’ data  //代表开启匹配模式,匹配这一行插入hello world
前面插入:
sed ‘2,3i\hello world’ data 在第二、三行前面插入hello world
sed ‘/aba 2/i\hello world’ data
删除:
sed ‘2,3d’ data 删除第二行和第三行  sed ‘d’ data 全部删除
sed ‘/aba 2/d’ data 匹配删除
删除以#开头或者包含#或者空行的行:-r开启正则表达式,^$代表空行
sed -r ‘/(^#|#|^$)/d’ data
修改:
sed ‘s/dog/cat/’ data 把所有行狗替换成猫,但是这个默认是把每句话中第一个狗替换成猫,如果一句话中存在第二个狗,那通过sed ‘s/dog/cat/2’ data 可以把第二个狗替换成猫,第一个狗还是狗。如果想要全部狗都变成猫,就用sed ‘s/dog/cat/g’ data。
sed ‘2,3s/dog/cat/’ data 把2、3行狗替换成猫
sed ‘/aba 2/s/dog/cat/’ data 匹配替换
sed ‘c\hello world’ data 把每一行都改成hello world
sed ‘3c\hello world’ data 只修改第三行为hello world
sed ‘2,4c\hello world’ data 把二到四行删掉加上一行hello world
sed ‘/aba 2/c\hello world’ data匹配修改
sed ‘y/abcdefg/ABCDEFG/’ data大写转成小写,这里前后的转换是一一对应的
打印:
sed ‘p’ data 得到的结果是两遍的,因为它把文件内容打印了,又把内存输出打印了
sed ‘2,4p’ data 把2-4行打印两遍
sed ‘/aba 2/p’ data匹配打印

2 flags标志位例子

sed ‘s/dog/cat/’ data 把所有行狗替换成猫,但是这个默认是把每句话中第一个狗替换成猫,如果一句话中存在第二个狗,那通过sed ‘s/dog/cat/2’ data 可以把第二个狗替换成猫,第一个狗还是狗。如果想要全部狗都变成猫,就用sed ‘s/dog/cat/g’ data
sed ‘3s/dog/cat/p’ data 把第三行的第一个的狗改成猫,并将第三行打印两遍(也就是有两个第三行),其他行也都存在且为一遍。
sed ‘3s/dog/cat/w mfile’ data 把修改的内容再额外保存在mfile中

3 命令选项例子

sed -n ‘3s/dog/cat/p’ data 只打印要求打印的,其他内容不打印。这个就只会打印第三行一行。
sed -e ‘s/brown/green/;s/dog/cat/’ data 【多个条件】将棕色改成绿色,狗改成猫。
如果把s/brown/green/和s/dog/cat/写入xx文件中,下次可以这样执行:
sed -f xx data
sed -i ‘s/dog/cat/g’ data 屏幕没有输出,而是直接对源文件进行修改,这是不可逆的。
sed -i.bak ‘s/dog/cat/g’ data 修改data文件,同时将没修改的文件备份到data.bak

4 与管道一起用例子

echo “ma is cool”|sed ‘s/ma/amao/’ 运行为amao is cool,这样就不需要文件了。

5 小技巧
打印文件行数:sed -n ‘$=’ data
使用正则表达式要加-r
.

十六:shell_awk基本用法

awk介绍

可以从输出流中把我们想要的数据找出来,并且对这些数据进行处理。它是一个行编辑器,可以对行进行截取,同时可以对截取的数据进行运算并输出结果。也就是说可以实现对数据的处理、运算、输出。
awk将视为记录(行间用回车分隔),视为字段(列间用空分隔)。

awk语法

awk [options] [BEGIN]{program} [END][file]
[BEGIN]在开始处理数据流之前执行,优先级最高,可选。[END]处理完数据流后执行,优先级最低,可选。program是默认,如何处理数据流,必选。
1 常用命令选项
-F fs 指定描绘一行中数据字段的文件分隔符 默认为空格
-f file 指定读取程序的文件名
-v var=value 定义awk程序中使用的变量和默认值
2 awk对字段(列)的提取
字段提取:提取一个文本中的一列数据并打印输出
字段相关内置变量:(数字代表想打印第几列)
$0 表示整行文本
$1 表示文本行中的第一个数据字段
$2 表示文本行中的第二个数据字段
$N 表示文本行中的第N个数据字段
$NF 表示文本行中的最后一个数据字段

#例子:
awk '{print $0}' test 打印每行全部数据
awk '{print $6}' test 打印每行的第六个字段

3 awk对记录(行)的提取

awk 'NR==3{print $0}' test 打印第三行
如果列与列之间是:分隔的:awk -F “:” 'NR==1{print $1}' test 打印第1行第1个字段
打印多个字段:awk -F “:” 'NR==1{print $1,$3,$5}' test
还可以完善输出格式:awk -F “:” 'NR==1{print “account:” $1,“UID:” $3,“DESC:” $5}' test【这里逗号输出时代表空格】

4 执行优先级

BEGIN的执行是不需要数据流的:awk ‘BEGIN{print “hello world”}’ 
计算内存使用率例子:head -2 /proc/meminfo | awk ‘NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t “%”}’
awk ‘BEGIN{name=“amao”;print name}’ 
此外还支持数组:awk ‘BEGIN{array[1]=“amao”;array[2]=18;print array[1],array[2]}’ 

awk运算

1 赋值运算 =
awk ‘BEGIN{name=“amao”;print name}’
awk ‘BEGIN{array[1]=“amao”;array[2]=18;print array[1],array[2]}’
2 比较运算 > >= == < <= != 返回值为1代表真,返回值为0代表假
awk ‘BEGIN{print “a” >= “b” }’ 返回值为0
3 数学运算 + - / % * ++ —
awk ‘BEGIN{print “a” >= “b” }’
4 逻辑运算 && ||
awk ‘BEGIN{print 100>=2 && 100>=3 }’ 返回值为1
5 匹配运算 ~ !~
精确匹配:awk -F: ‘$1==“root”{print $0}’ passwd
除它之外的:awk -F: ‘$1!=“root”{print $0}’ passwd
模糊匹配:awk -F: ‘$1 ~ “ro”{print $0}’ passwd 每行第一个字节只要包含ro,这行就打印出来
除它之外的:awk -F: ‘$1 !~ “ro”{print $0}’ passwd

awk环境变量

FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS 数据源的字段默认分隔符(输入字段分隔符号)
OFS 输出到屏幕以后的字段的分隔符(输出字段分隔符号)
RS 输入记录分隔符号
ORS 输出记录分隔符号

例子:
awk ‘BEGIN{FIELDWIDTHS=“5 2 8”}NR==1{print $1,$2,$3}’ /etc/passwd 在执行program之前指定列宽,打印三列,每列分别需要5、2、8个字符,将第一行分完以后将$1\$2\$3打印出来,分别对应5、2、8个字符,之间用空隔开。
awk -F: ‘$1 !~ “ro”{print $0}’ passwd 等同于 awk ‘BEGIN{FS=“:”}$1 !~ “ro”{print $0}’ passwd  FS指passwd的分隔符。
awk ‘BEGIN{FS=“:”;OFS=“-”}$1 == “root”{print $1,$3,$5}’  OFS=“-”表示输出时分隔符为-
awk 'BEGIN{RS="";OFS="\n"}{print $1,$2,$3}' num
awk 'BEGIN{RS="";ORS="\n"}{print $1,$2,$3}' num 
OFS与ORS输出不同。

awk流程控制

1 if判断语句

awk '{if($1>5)print $0}' num
awk '{if($1>5)print $1/2;else print $1*2}' num

2 for循环语句

awk -v ‘sum=0’ ‘{sum+=$1}END{print sum}’ num 1到10求和,也可以用begin去做
awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2 按行求和,并输出三个结果。

3 while循环语句

awk '{sum=0;i=1;while(sum<150){sum+=$i}print sum}' num2 将每行的第一个数值重复累加,直到和大于或等于150为止
awk '{sum=0;i=1;while(sum<150){sum+=$i;i++}print sum}' num2 将每行的数值累加,直到和大于或等于150为止

4 do…while语句

awk '{sum=0;i=1;do{sum+=$i;i++;}while(sum<150);print sum}' num2 这个区别在于是先加后判断

5 循环控制
break跳出循环

awk小技巧

打印文本的行数 awk ‘END{print NR}’ test
打印文本的列数 awk ‘END{print NF}’ test
打印文本最后一行内容 awk ‘END{print $0}’ test

其他:sh -x amao.sh可以进行debug操作

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值