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
状态下为LISTEN
和CONNECTED
的连接数量
netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum) print i, sum[i]}'
网友评论