Linux基础10-shell2

sed流式编辑器

sed是一个非交互的文本编辑器,实现的功能跟vim相同,主要是对文件内容进行输出、删除、替换、复制、剪切、导入、导出等功能

命令格式1:前置命令 | sed [选项] '[指令]' 文件名

命令格式2: sed [选项] '[指令]' 文件名

常用选项:

-n #屏蔽默认输出;默认将所有结果输出到屏幕

-i #直接修改文件内容,若不加-i不会真正改变文件的内容

-r #使用扩展正则,若与其他选项连用应作为首个选项

动作指令:

p #打印指定的行,如:2,4p 打印第234行,2p;4p 打印第2行与第4行

d #删除指定的行,如:2,4d 删除第234行,2d;4d 删除第2行与第4行

s #字符串替换,如:s/旧子串/新子串/ ;默认只替换每一行匹配到的第一个子串

 #  '/' 只是替换符,可使用任意的特殊字符

    #替换文件中每一行匹配到的第一个子串:sed 's/xx/oo/' test

 #替换文件中每一行匹配到的第二个子串:sed 's/xx/oo/2' test

 #替换文件中每一行匹配到的所有子串:sed 's/xx/oo/g' test

r #导入文件内容,默认读一行导一次

 #将文件导入到指定的行下:sed '1r/opt/a.txt' test

w #导出文件内容

 #将test的第一行内容导出到b.txt:sed '1w b.txt' test

sed -n '$='  文件名 #统计文件行数

awk编程语言

基于模式匹配检查输入文本,逐行处理并输出,获取指定的数据

awk过滤数据时支持仅打印某一列

命令格式1:awk [选项] '条件1{指令} 条件2{指令}' 文件名

命令格式2:前置命令 | awk [选项] '条件{指令}'

常用指令:print #打印

常用选项:-F #指定分隔符,默认以空格为分隔符,可通过[]集合匹配多种单个字符

awk内置变量:$1第一列,$2第二列,以此类推,NR文件当前行号,NF文件当前列数

#默认以空格为分隔符打印文件第1列和第7列:awk '{print $1,$7}' test

#手动指定以:为分隔符打印文件第1列:awk -F: '{print $1}' test

#通过[]集合匹配多种单个字符作为分隔符打印文件第1列和第7列:awk -F[:\] '{print $1,$7}' test

#打印文件每一行与每一行的列数:awk '{print NR,NF}' test

#匹配第一列包含root的行并打印第1列:awk -F: '$1~/root/{print $1}' test

awk使用数值/字符串比较设置条件

等于:==

不等于:!=

大于:>

大于等于:>=

小于:<

小于等于:=<

#打印文件中第3列大于等于1000,打印第1列,第3列,第7列:awk -F: '$3>=1000{print $1,$3,$7}' test

awk过滤时机:awk 'BEGIN{指令} {指令} END{指令}' 文件名

BEGIN{指令} #读取文件内容之前执行命令,指令执行一次,行前处理

{指令} #读取文件过程中执行,指令逐行执行,读一行,执行一次

END{指令} #读取文件内容结束后执行指令,指令执行一次,行后处理

#通过awk统计系统里使用bash解释器的用户有什么个:

awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd

awk分支结构

if单分支格式:if(条件){指令}

#if单分支统计passwd文件中UID大于或等于1000的用户个数

awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd

if双分支格式:if(条件){指令}else{指令}

#if双分支统计passwd文件中UID大于等于1000的用户,和小于1000的用户个数

awk -F: '{if($3>=1000){i++} else{x++}} END{print i,x}' /etc/passwd

awk数组

定义数组格式1:数组名[下标]=值

定义数组格式2:数组名[下标]

数组用法:for(变量名 in 数组名){print 数组名[变量]}

awk循环结构

命令格式:for(变量名 in 数组名){print 数组名[变量]}

awk命令格式2:前置命令 | awk [选项] '条件{指令}'

#通过awk打印剩余内存:free -h | grep Mem | awk '{print $4}'

#通过awk统计用户登录系统的次数:who | awk '{ip[$1]++}END{for(i in ip)print i,ip[i]}'

posted @   胖丿虎  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示