美文网首页
临时随笔sed/awk

临时随笔sed/awk

作者: 王哈哈就很棒 | 来源:发表于2020-06-06 13:32 被阅读0次

sed替换指定行内容

sed -i '开始行号,结束行号#要替换的内容#替换为的内容#' 文件位置
sed 's/^/添加的头部&/g'      #在所有行首添加
sed 's/$/&添加的尾部/g'      #在所有行末添加
sed '2s/原字符串/替换字符串/g'  #替换第2行
sed '$s/原字符串/替换字符串/g'   #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行

sed

命令行格式

sed [options] 'command' file(s)
    options: -e -n
    command: 行定位(正则)+sed命令(操作)

脚本格式

sed -f scriptfile file(s)

基本操作命令

-p 打印相关行
-n 打印出相关的行,不想关的就不打印

sed 'p' /etc/passwd
sed -n 'p' /etc/passwd

行定位

# 定位一行
x;      /正则/

# 定位到第10行
sed -n '10p' /etc/passwd

# 打印文本第10行
nl /etc/passwd | sed -n '10p'

# 打印root
sed -n '/root/p' /etc/passwd
nl /etc/passwd | sed -n '/root/p'

# 定位几行
x,y;        /正则/,x;
# 定位第10行到15行
nl /etc/passwd | sed -n '10,15p'

# 定位匹配的地方到另一个匹配的地方
nl /etc/passwd | sed -n '/正则/,/正则/'

# 取反,不选择第10行
nl /etc/passwd | sed -n '10!p'

# 定位间隔几行
first~step
nl /etc/passwd | sed -n '1~5p'

操作命令

-a      # 新增行
-i      # 插入行
-c      # 替代行
-d      # 删除行
# 指定行后面增加内容(第5行后面增加==================)
nl /etc/passwd | sed '5a =================='

# 第1行到第5行后面增加内容
nl /etc/passwd | sed '1,5a ----------------'

# 在前面插入,第一行至第5行
nl /etc/passwd | sed '1,5i ####################'

# 替换指定行
nl /etc/passwd | sed '2c helloworld'

# 指定范围替换为一个内容
nl /etc/passwd | sed '1,8c @@@@@@@@@@@'

# 删除指定行
nl /etc/passwd | sed '1,10d'
nl /etc/passwd | sed '/正则/d'
nl /etc/passwd | sed '/root/d'

实例

# 在文件末尾增加配置
sed '$a username=root \npassword=111111 \nhost=localhost \nport=3306' /etc/passwd

# 加空格(前面加4个空格,可以看到第一个添加空格失败)
sed '$a     username=root \n    password=111111 \n    host=localhost \n    port=3306' /etc/passwd

# 添加转义字符, 方可解决问题
sed '$a \    username=root \n    password=111111 \n    host=localhost \n    port=3306' /etc/passwd

# 删除空行
sed '/^$/d' /etc/passwd

替换命令

-s  替换
-g  全局

# 把/etc/passwd中的nologin替换为hello
sed 's/nologin/hello/' /etc/passwd

# 把/etc/passwd中的: 替换为# (可以看到每一行的只替换了一个)
sed 's/:/#/' /etc/passwd

# 加上g全局替换就可以把一行中的所有符合的都替换掉
sed 's/:/#/g' /etc/passwd   
# 获取ip地址
ifconfig ens32
ifconfig ens32 | sed -n '/inet /p'
ifconfig ens32 | sed -n '/inet /p' | sed 's/inet //'
ifconfig ens32 | sed -n '/inet /p' | sed 's/inet //' | sed 's/netmask.*$//'

高级操作命令

-{}     # 多个sed命令用;分开
-n      # 读取下一个输入行(用下一个命令处理)
-&      # 替换固定的字符串
-\( \)      # 替换某种(某部分)字符串(\1,\2)
-r      # 复制指定文本插入到匹配行
-w      # 复制匹配行拷贝指定文件里
q           # 退出sed
# 把/etc/passwd中第10行到第15行删除,并且把nologin替换为hello
nl /etc/passwd | sed '{10,15d;s/nologin/hello/g}'
# 跳行输出
nl /etc/passwd | sed -n '{p;n}'
nl /etc/passwd | sed -n '{n;p}'
nl /etc/passwd | sed -n '{n;n;p}'
# 用户名后面加空格
sed -n 's/\w\+/&   /p' /etc/passwd

大小写转换

\u      # 对首字母大小写转换
\l      # 对首字母大小写转换
\U      # 对一串字符的大小写转换
\L      # 对一串字符的大小写转换
# 将所有字母转换为大写
ifconfig | sed 's/\w\+/\U&/g'

# 将所有字母转换为大写后,再转换为小写
ifconfig | sed 's/\w\+/\U&/g' | sed 's/\w\+/\L&/g'
# 拿到/etc/passwd中的用户名
sed 's/\(^[a-z0-9_-]\+\):.*$/\1/' /etc/passwd

# 拿到用户名和UID
sed 's/\(^[a-z0-9_-]\+\):x:\([0-9]\+\):.*$/用户名=\1   UID=\2/' /etc/passwd

# 拿到用户名和UID和GID
sed 's/\(^[a-z0-9_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/用户名=\1    UID=\2    GID=\3/' /etc/passwd

结果如下
用户名=root    UID=0    GID=0
用户名=bin    UID=1    GID=1
用户名=daemon    UID=2    GID=2
用户名=adm    UID=3    GID=4
用户名=lp    UID=4    GID=7
用户名=sync    UID=5    GID=0
用户名=shutdown    UID=6    GID=0
用户名=halt    UID=7    GID=0
用户名=mail    UID=8    GID=12
用户名=operator    UID=11    GID=0
用户名=games    UID=12    GID=100
用户名=ftp    UID=14    GID=50
用户名=nobody    UID=99    GID=99
用户名=systemd-network    UID=192    GID=192
用户名=dbus    UID=81    GID=81
用户名=polkitd    UID=999    GID=998
用户名=sshd    UID=74    GID=74
用户名=postfix    UID=89    GID=89
用户名=chrony    UID=998    GID=996
用户名=ntp    UID=38    GID=38
用户名=mysql    UID=1000    GID=1000
用户名=saslauth    UID=997    GID=76
用户名=www    UID=1001    GID=1001
# 拿到ip
ifconfig ens32 | sed -n '/inet /p' | sed 's/inet \([0-9.]\+\).*$/\1/'
# 将123.txt中的内容拷贝到abc.txt中第一行后面, 并不会对文件进行修改,如需修改则重定向即可
sed '1r 123.txt' abc.txt

# 将123.txt中的第一行写到abc.txt中, 源文件会被修改
sed '1w abc.txt' 123.txt

# 将123.txt中的所有内容写入abc.txt中
sed 'w abc.txt' 123.txt
# 读取到第10行结束
nl /etc/passwd | sed '10q'

# 找到第一个nologin就结束
nl /etc/passwd | sed '/nologin/q'

awk

awk内置变量1

$0      # 表示整个当前行
$1      # 每行第一个字段
$2      # 每行第二个字段

awk内置参数:分隔符

options: -F field-separator(默认为空格)
awk -F ':' '{print $1}' /etc/passwd
awk -F ':' '{print $1,$3}' /etc/passwd
awk -F ':' '{print "Username:"$1,"\t", "UID:"$3}' /etc/passwd
NR      # 行号
NF      # 字段数量变量
FILENAME        # 正在处理的文件名
awk -F ":" '{print NR,NF,FILENAME}' /etc/passwd
awk -F ":" '{print "行号:"NR, "字段数量:"NF, "文件名:"FILENAME}' /etc/passwd

使用printf

awk -F ':' '{printf("行号:%s 字段数:%s 文件名:%s\n", NR, NF, FILENAME)}' /etc/passwd

实例

打印用户UID大于100的

awk -F ':' '{if($3>100)print"用户名:"$1,"\tUID:"$3}' /etc/passwd

awk使用正则

awk '/正则/{print $1}' /etc/passwd
awk '/root/{print $1}' /etc/passwd

awk逻辑判断式

~, !~                   # 匹配正则表达式
==,!=, <, >     # 判断逻辑表达式

实例

打印/etc/passwd中用户名以m开头的

awk -F ':' '$1~/^m.*/{print "行号:"NR, "结果:"$1}' /etc/passwd
# 取反!~
awk -F ':' '$1!~/^m.*/{print "行号:"NR, "结果:"$1}' /etc/passwd
# 找出UID小于100的
awk -F ':' '$3<100{print "USERNAME:"$1, "\tUID:"$3}' /etc/passwd

# 找出UID等于0的
awk -F ':' '$3==0{print "USERNAME:"$1, "\tUID:"$3}' /etc/passwd

# 找出UID不等于0的
awk -F ':' '$3!=0{print "USERNAME:"$1, "\tUID:"$3}' /etc/passwd

扩展格式

BEGIN{print "start"} pattern{commands}END{print "end"}

实例

制表显示/etc/passwd每行的行号,每行的列数,对应行的用户名

awk -F ':' 'BEGIN{print "用户名    UID    GID"}{print $1,"\t",$3,"\t",$4}END{print "--------"FILENAME"---------"}' /etc/passwd

统计当前文件夹下的文件/文件夹占用的大小

ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is:"size/1024/1024"M"}'

统计显示/etc/passwd的账户总人数(排除空行)

awk 'BEGIN{count=0}$1!~/^$/{count++}END{print "共计:"count}' /etc/passwd

统计显示UID大于100的用户名

awk -F ':' 'BEGIN{count=0}{if($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i, name[i]}' /etc/passwd

统计netstat -anp状态下为LISTENCONNECTED的连接数量

netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum) print i, sum[i]}'

相关文章

网友评论

      本文标题:临时随笔sed/awk

      本文链接:https://www.haomeiwen.com/subject/jpsxtktx.html