grep,sed,awk个人总结-创新互联
正则表达式
ifconfig |sed -n '2p' |sed 's.*inet//g' |sed 's#netmask.*$##g' #用/ # 均可 理论可用任何特殊字符替代
#sed -r 后面可跟扩展正则 扩展正则 + (.*)
ifconfig |sed -n 2p |sed -r 's#^.*inet (.*) Broast.*$#\1#g' # \1 代表正则中的第一个GROUP 即(.*)里的内容
ifconfig |sed -nr '2s#^.*inet (.*)net.*$#\1#gp' #合成一行
ifconfig |awk 'NR==2{print $2}' #取IP地址 awk 默认分隔符是空格 取IP 最方便
ifconfig ens33| grep -o "inet [0-9.]*" |grep -o "[0-9.]*" #取IP
ifconfig ens33| sed -nr '2s#^.*inet ([0-9].*)netmask.*$#\1#gp'
cat oldboy.txt| sed -r 's#^ .*inet(.*)netmask(.*)broadcast(.*)$^C1 \2 \3 #g'
sed -r 's#(.*):(.*):(.*):(.*):(.*):(.*):(.*)$#\7 \6 \5 \4 \3 \2 \1#g' #后向引用换位置 sed最多引用9个,用awk更方便
sed -n '/^$/d' #空行删除 //中写字符串
sed '1,2s#C#--&-#g' # 这里&代表C C 也可以是正则表达式
ls | sed 's#(^.*)haha#mv \1.jpg#g' |bash
sed '1~2p's #a i d奇数行
sed '2~2p's #a i d偶数行
sed 's#^#head#g' #头加
sed 's#$#tail#g' # 尾加
sed 's#^#test#g' #开头加test
sed 's#$#test#g' #末尾加test
sed多行操作 sed '2a,str' '1~2a,str' '1,10i,str' / '1,2d' '5~10d' / '1~3p' '1,3p'
#sed 在 a i d 的时候 必须有相应的行,空文件会出错,也就是说 空文件无法直接用sed 添加
sed '/new/d' # 删除包含new的行 sed命令中 -n p sed 中 -n p 基本都是成对出现
awk -F ":" '{print $1":"$2":"$3":"$4":"$5":"$6":"$7"------"$1}' passwd #这里是全文操作
awk -F "5:5|28" 'NR==5{print $2}' #5:5 或 28 作为分隔符 两个字符串 这种格式最好用| 即使单个字符也用| 否则字符串造成歧义
ll | awk '{if($2>5) print $0}' $0 表示整行
sed -i 's#pp#dd#g' 1.txt 将1.txt 文件中的pp 改成dd 立即生效 -i 代表直接写入文件
#在LINUX 中,所有的文本处理 都是读取一行(进内存) 处理一行 输出一行 直接循环结束
正则表达式 字符串用"" 以防问题
^.* 以任意字符开头
.*$ 以任意字符结尾
^word 以word 开头
word$ 以word 结尾
[^word] 括号里的是取反
. 只代表一个字符 "是字符就匹配上了 所有除空行" 空格和空行是不一样的
\ 转义
* 重复前面0或多个字符
.* 所有
[abc] 匹配集合内任意一个字符
[^abc] 匹配集合内除abc 的任意一个字符
[0-9] [a-z] [A-Z]
a\{n,m\} 重复a 至少n次到至多m 次 ## a\{n,m\} 这种形式必须用""引起来 且""两边没有空格 ,否则会报错
a\{n,\} a\{,m\} a\{n\}重复n次
egrep sed -r 可以不使用\转义
## 了解 扩展正则表达式 grep -E egrep
+ 一个或一个以上 (*是0或多)
? 0或一个前面字符
| 表示同时过滤多个字符串 egrep "sshd|systemd"
() 后向引用 参考(.*) \1
grep -n -i 不区分大小写 -o 只显示匹配到的内容 不输出整行
find /test -type f -name "*.sh" |xargs sed -i 's#old#new#g' ! 叹号可取反 -a and -o or
也可同时写 sed -i 's#old#new#g' *.sh
#awk
NR $0整行 $1 $2 $NF最后一列 NF 为全行列数
$(NF-1)倒数第二行
#awk原理 一行是一个记录
#RS表示一个记录的结束 FS表示一个区域的分隔 $NF 为最后一个区域
ifconfig |awk 'BEGIN{RS=":"}''{print $1}' 以:为代替回车 为换行符
#正则 条件(NR==2) 范围(NR==2,NR==5)2到5
# $1~/正则开始/,$3~/正则结束/
awk -F "[ :]+|\t+" '{print $2}' grade 以1个或多个 :(空格或冒号)或1或多个tab制表符 作为分隔符
#BEGIN模块 END模块
seq 1 100 |awk '{a+=$1}''END{print a}' 1加到100
cat passtemp |awk '{sub(/x/,"ppp")}''{print $0}' awk替换
awk '$1~/lisi/{print $0}' grade grade文件匹配$1 包括lisi的行 并打印出行
awk '$4~/(5|3)$/{print $0}' grade 匹配 5 或 3结尾
awk '$1~/^[l|W]/{print $0}' grade 匹配l 或 W 开头 用[] 和()都可为了和正则匹配 强烈建议用[]
awk -F "\t" '$3~/^9/{print $0}' grade
#不包含:!,在awk中不包含可以使用! 表示
#在awk中,可以用来替换的有三个函数:sub gsub gensubsub(r, s [, t])
r /找谁/
s "替换成什么"
[] 替换那个部分的
awk '$1~/zhan/{gsub(/zhang3/,"ccccc",$1);print $0}' grade
##注意 /zhang3/ "ccccc" 以及多个命令间用; 分号
新闻标题:grep,sed,awk个人总结-创新互联
标题URL:http://cdiso.cn/article/ihshe.html