shell编程之awk_shell 单行 awk 变量

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!



#### **四、记录与字段相关内部变量:**



1.记录和字段
awk 按记录处理:一行是一条记录,因为awk默认以换行符分开的字符串是一条记录。(默认\n换行符:记录分隔符)
字段:以字段分割符分割的字符串 默认是单个或多个“ ” tab键。

2.awk中的变量
$0:表示整行;
NF : 统计字段的个数
$NF:是number finally,表示最后一列的信息
RS:输入记录分隔符;
ORS:输出记录分隔符。
NR:打印记录号,(行号)
FNR:可以分开,按不同的文件打印行号。
FS : 输入字段分隔符,默认为一个空格。
OFS 输出的字段分隔符,默认为一个空格。
FILENAME 文件名 被处理的文件名称
$1 第一个字段,$2第二个字段,依次类推…


#### **实战**



FS(输入字段分隔符)—一般简写为-F(属于行处理前)
[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{FS=“:”} {print $1,$2}’
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
[root@awk ~]# cat /etc/passwd | awk -F":" ‘{print $1,$2}’
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x

#注:如果-F不加默认为空格区分!

OFS(输出字段分隔符)
[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{FS=“:”;OFS=“…”} {print $1,$2}’
root…x
bin…x
daemon…x
adm…x
lp…x
sync…x
shutdown…x
halt…x
mail…x

1.创建两个文件
[root@awk ~]# vim a.txt
love
love.
loove
looooove


[root@awk ~]# vim file1.txt
isuo
IPADDR=192.168.246.211
hjahj123
GATEWAY=192.168.246.1
NETMASK=255.255.255.0
DNS=114.114.114.114

NR 表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号
[root@awk ~]# awk ‘{print NR,$0}’ a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
6 isuo
7 IPADDR=192.168.246.211
8 hjahj123
9 GATEWAY=192.168.246.1
10 NETMASK=255.255.255.0
11 DNS=114.114.114.114

FNR:表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号(#会将不同文件分开)
[root@awk ~]# awk ‘{print FNR,$0}’ a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
1 isuo
2 IPADDR=192.168.246.211
3 hjahj123
4 GATEWAY=192.168.246.1
5 NETMASK=255.255.255.0
6 DNS=114.114.114.114

RS(输入记录分隔符)
1.创建一个文件
[root@awk ~]# vim passwd
root❌0:0:root:/root:/bin/bashbin❌1:1:bin:/bin:/sbin/nologin
[root@awk ~]# cat passwd | awk ‘BEGIN{RS=“bash”} {print $0}’
root❌0:0:root:/root:/bin/
bin❌1:1:bin:/bin:/sbin/nologin

ORS(输出记录分隔符)
2.对刚才的文件进行修改
[root@awk ~]# vim passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
[root@awk ~]# cat passwd | awk ‘BEGIN{ORS=" "} {print $0}’
root❌0:0:root:/root:/bin/bash bin❌1:1:bin:/bin:/sbin/nologin

NF:统计列的个数
[root@awk ~]# cat /etc/passwd | awk -F":" ‘{print NF}’
7
7
7
7
$NF:打印最后一列
[root@awk ~]# cat /etc/passwd | awk -F":" ‘{print $NF}’
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
练习1:将文件合并为一行
[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{ORS=“” } {print $0}’
练习2:把一行内容分成多行
1.首先创建一个文件
[root@awk ~]# vim d.txt
root❌0:0:root:/root:/bin/bash
[root@awk ~]# cat d.txt | awk ‘BEGIN{RS=“:”} {print $0}’
root
x
0
0
root
/root


#### **关系运算符号**


实现 字符串的完全相等需要使用 `==`



> 
>  字符串需要使用双引号  
>  `!=` 表示不等于 
> 



[root@awk ~]# awk -F":" ‘$NF == “/bin/bash”’ /etc/passwd
[root@awk ~]# awk -F":" ‘$1 != “root”’ /etc/passwd


* 比较表达式:



> 
>  比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。 比较表达式使用 
>  ***关系运算符***,用于比较数字与字符串。 
>    
>  关系运算符有  
>  `<` 小于 例如  
>  `x<y`  
>  `>` 大于  
>  `x>y`  
>  `<=` 小于或等于  
>  `x<=y`  
>  `==` 等于  
>  `x==y`  
>  `!=`不等于  
>  `x!=y`  
>  `>=` 大于等于  
>  `x>=y`
> 


#### **示例**



[root@awk ~]# awk -F":" ‘$3 == 0’ /etc/passwd
[root@awk ~]# awk -F":" ‘$3 < 10’ /etc/passwd


* 算术运算:`+`, `-`, `*`, `/`, `%(模: 取余)`, `^(幂:2^3)`



> 
>  可以在模式中执行计算,awk都将按浮点数方式执行算术运算 
> 



awk -F: ‘$3 * 10 > 500’ /etc/passwd


* 逻辑操作符和复合模式



> 
> `&&` 逻辑与, 相当于 并且  
>  `||`逻辑或,相当于 或者  
>  `!` 逻辑非 , 取反 
> 



awk -F":" ‘$1~/root/ && $3<=15’ /etc/passwd
awk -F":" ‘$1~/root/ || $3<=15’ /etc/passwd


#### **常见使用**


1.打印一个文件中的第2列和第5列



cat /etc/passwd | awk -F : ‘{print $2,$5}’


2.打印指定行指定列的某个字符



free -m | awk ‘NR==2 {print $2}’


3.统计一个文件的行数



cat /etc/passwd | awk ‘{print NR}’


获取根分区的使用量


4.在awk中使用if条件判断



++i:从1开始加,赋值在运算
i++: 从0开始加,运算在赋值
if语句:
{if(表达式){语句;语句;…}}

实战案例:
显示管理员用户姓名
[root@qfedu ~]# cat /etc/passwd | awk -F":" ‘{if($3==0) {print $1 " is administrator"}}’

统计系统用户数量
[root@qfedu ~]# cat /etc/passwd | awk -F":" ‘{if($3>=0 && $3<=1000){i++}} END{print i}’


5.在awk中使用for循环



每行打印两遍
[root@qfedu ~]# awk ‘{for(i=1;i<=2;i++) {print $0}}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin


**数组遍历**--用来统计网站日志,tcp连接状态等。



++i:从1开始加,运算在赋值
i++: 从0开始加,赋值在运算
#按索引遍历:
1.先创建一个test文件

vim test.txt #将文件内容的第一个字段作为数组的值,通过索引获取到值

root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin

cat test.txt | awk -F":" ‘{username[x++]=$1} END{for(i in username) {print i,username[i]}}’

0 root
1 bin
#注意:变量i是索引


#### **真实案例**


**在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**


需要完整版PDF学习资源

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值