笔记

学习各种的笔记

sed的增删改查

r   支持扩展正则

a   apend 追加文本到指定行后

i   insert 插入文本到指定行前

如sed ‘2a 106,dandan,CSO’ 文本名

 在sed工具中  引号比较

sed '2i $PATH' 文本名 #单引号内容原本插入

sed 2i $PATH 文本名不加单引号则错误

sed "2i $PATH" 文本名 加双引号则被解析

多行增

附加录入简单文本 cat > 文本名 <<EOF

内容,,,,

EOF 结束的标志

echo -e '' luo luo'' # 表示换行 表示tab键

sed '2a 内容1 内容2' 文本名

优化ssh配置

备份 cp /etc/ssh/sshd_config{,.bak}

sed -i '13i port 端口号 PermitRootLogin no PermitEmptyPasswords no UseDNS no GSSAPIAuthentication no' /etc/ssh/sshd_config

查看 sed -n '13,17p' /etc/ssh/sshd_config

sed 'd' 文本名 默认全部删除

sed '2d' 文本名 删除第二行

sed '2,5d' 文本名 删除第二行到第五行内容

sed '/匹配的内容/d' 文本名  匹配到有的内容就删除该行

sed '/内容1/,/内容2/d' 文本名 删除包含内容1的行到内容2的行

sed '3,$d' 文本名 从第三行开始删除直到删除到最后一行

sed '/内容/,3d' 文本名 删除包含内容到第三行的内容

sed软件使用正则表达式会找出所有匹配的行,即使有数字地址限制

sed '2,/内容/d' 文本名 从第二行删除到含内容的行结束

sed 10  随机输出10个数

sed '1,+2d' 文本名 删除第一行到第3(1+2)行的文本

sed '2,3!d' 文本名 除了第二行和第三行以外的内容都删除

sed '/内容/d' 文本名 删除包含内容的行

改,替换

sed '2c 内容' 文本名

sed替换模型

sed -i 's/目标内容/替换内容/g' 文本名  sed -i 's#目标内容#替换内容#g' 文本名  

eval sed 's#$x#$y#g' 文本名 eval 命令能读入变量

取ip地址

ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#1#gp'

优化开机

chkconfig --list | egrep -v "sshd|crond|rsyslog|sysstat|network" | awk '{print "chkconfig",$1,"off"}' | bash

直接awk

chkconfig --list | egrep -v "sshd|crond|rsyslog|sysstat|network" | awk '{print "chkconfig",$1,"off"}'

 | bash

sed -n '2p' 文本名

sed -n '2,3p' 文本名

sed -n 'p' 文本名 输出全部

按字符串查询

sed -n '/内容/p' 文本名 

sed -n '/内容1/,/内容2/p' 文本名

修改文件同时备份

sed -i .bak 's#1111111#222222#g' 文本名

获取行号

sed '=' 文本名 | sed 'N;s# # #'   #sed命令N读取下一行数据并附加到模式空间

sed '=' 文本名

sed '1,3=' 文本名

sed '/yy/=' 文本名

sed -n '/yy/=' 文本名

sed -n '$=' 文本名

取不连续的行

sed -n '1p;3p;5p' 文本名

sed -n '2,4p;=' 文本名

sed -n '2,4{p;=}' 文本名

awk

awk [options] 'pattern {action}' file

awk -F ":" 'NR>=2 && NR<==6 {print NR,$1}' /etc/passwd

解释: -F 指定分隔符为冒号,相当于以 : 为菜刀,进行字段的切割

NR>=2 && NR<=6 表示模式 条件取第二行到第六行

{print NR, $1} 表示动作,输出NR行号和$1第一列

awk -F ":" 'NR>=2 && NR<=6' /etc/passwd

awk -F ":" '{print NR,$1}' 文本名

awk -F ":" 'NR==1{print NR,$1}NR==2{print NR,$NF}' 文本名  #$NF 最后一列

awk '{print NR,$0}' 文本名   #NR 记录号 $0 整个记录/整行

awk 'BEGIN{RS="[ ]+"}{print $0}' 文本名   #设置RS为空格

遇排序,去重问题

sort -u 去重复 -n 数字排序 -r 反向逆转排序  uniq -c 计数

awk 'BEGIN{RS="[]+"}{print $0}' 文本名 | sort | uniq -c |sort

cat 文本名 | ttr " " " " | sort | uniq -c | sort

grep -o "[a-zA-Z]+" 文本名 | sort | uniq -c | sort

awk -F ":" 'NR>=2&&NR<=5{print $1,$3}' 文本名 冒号为分隔符显示第2行到第5行之间的第一区域和第三区域

awk -F "[ ,]" '{print $3,$NF' 文本名 [ ,] 既空格或者逗号

取ip地址

ifconfig eth0 | awk  'NR==2' | awk -F "[ :]+" '{print $4}'

ORS与OFS两内置变量含义

RS输入记录分隔符,决定awk如何读取或分隔每行(记录)

ORS输出记录分隔符,决定awk如何输出一行(记录)的

FS输入区域分隔符 决定awk读入一行后如何再分为多个区域

OFS输出区域分隔符,决定awk输出每个区域的时候使用什么分隔它们

正则表达式

^ 字符串开头   $字符串结尾  .匹配任意单个字符  *重复0个或多个前一个字符  +重复前一个字符一次或多次  ?匹配0个或前边的字符  []匹配指定字符组内的任一个字符  [^]匹配不在指定字符组内的任一字符  ()子表达式组合   | 或者的意思  x{m} 字符重复m次  x{m,} x字符重复至少m次  x{m,n} x字符重复至少m,但不超过n次

awk -F ":" '/^root/' 文本名  #正则表达式匹配整行

awk -F ":" '$5~/shutdown/' 文本名  #匹配一行中的某列

简单文本 cat >> 位置/文件名 << KOF

awk -F "[ :]+" '$1~/^内容/{print $2,$(NF-1)}' 文本名  #-F 指定分隔符 [ :]+ 连续的空格或冒号  -F "[ :]+ 以连续的空格或冒号为分隔符   /zhang/表示条件,整行中包含内容字符的这个条件  {print 1,(NF-1)} 表示动作,满足条件后,执行显示第一列$1和倒数第二列((NF-1))当然$5也可以

取ip地址

ifconfig eth0 | awk 'BEGIN{RS="[ :]"} NR==31'

ifconfig eth0 | awk -F " (addr:)|(Bcast:)" 'NR==2{print $2}'

ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'

ifconfig eth0 | awk -F "[^0~9]+" 'NR==2{print $2}'

awk正则之{} 花括号

awk -F: '$1~/o{1,2}/" 文本名

awk -F: --posix '$1~/o{1,2}/' 文本名

awk -F: --re-interval '$1~/o{1,2}/' 文本名

取端口

awk -F "[ /]+" '$1~/^(ssh)$|^(http)$|^(https)$|^(mysql)$|^(ftp)$/{print $1,$2)' /etc/services | sort | uniq

awk -F ":"' $5=="root"' 文本名

awk -F ":" '$5~/^root$/' 文本名

awk '/^bin/,NR==5{print NR,$0}' 文本名  #以bin开头的行,到第五行的行号和整行内容

awk -F ":" '$5~/^bin/,/^lp/{print NR,$0}' 文本名  #第五列开始以bin开头的行到以lp开头的行,显示行号及整行内容

awk -F ":" '$5~/^bin/,$5~/^lp/{print NR,$0}' 文本名  #从第五列bin开头字符串的行到第五列lp开头字符串的行

awk特殊模式-BEGIN,END模式

1,内置变量定义

取IP地址

ifconfig eth0 | awk 'BEGIN{FS="(addr:)|(Bcast:)"} NR==2{print $2}'

ifconfig eth0 | awk 'BEGIN{FS="[ :]+"} NR=2 {print $4}'

ifconfig eth0 | awk 'BEGIN{NF="[^0-9.]+"} NR==2 {print $2}'

2,输出表头

awk -F: 'BEGIN{print "username","UID"} {print $1,$3}' 文本名

3,特殊性质

awk 'BEGIN{print "hello world!"}'

awk 'BEGIN{print 10/3}'

awk 'BEGIN{a=1;b=2;print a,b}'

awk 'BEGIN{a=1;b=2;print a,b,a+b}'

END模块

统计空行

grep "^$" 文本名 | wc -l

grep -c "^$" 文本名

awk '/^$/{i++}END{print i}' 文本名

总和

awk '{i=1+$0}END{print i}' 文本名

计数

awk -F "[/]+" '{i++;print $2,i}' 文本名  # i++ i最开始是空的,当awk读取一行,i自身加1

数组替换

awk -F "[/]+" '{h[$2]++;print $2,h["过滤的内容"]}' 文本名  # i替换成h[$2] 相当于创建了数组h[],h[$2]++就等于i++

最终

awk -F "[/]+" '{h[$2]++} END {for (i in h) print i,h[i]}' 文本名

原文地址:https://www.cnblogs.com/luozhongyuan/p/9909671.html