首页 > 代码库 > sed,awk
sed,awk
^ 行首定位符
^love 匹配所有以love开头的行
$ 行尾定位符
love$ 匹配所有以love结尾的行
. 单个任意字符
l..e 匹配以l开始后跟两个字符再跟一个e的字符串
* 重复0到多个星号前面的字符
a* 匹配0个或多个a的字符串
[]匹配一组字符的任意一个
[Ll]ove 匹配Love或love的字符串
[x-y]匹配指定范围的一个字符
[A-Z]ove 匹配大写字符开头后跟ove的字符串
[^]匹配不在指定组内的字符
[^A-Z] 匹配不是大写字母的任意字符
\ 转义字符用来转义元字符
love\. 匹配love后跟一个.的字符
! 取反
+ 表示一个或多个
xyz+ 一个或多个z
? 表式0个或一个
xyz? 0个或一个z
RE元字符
\< 词首定位符\<love 匹配love开头的词
|> 词尾定位符love\> 匹配love结尾的词
\<bin\> 匹配一个单词
\(..\) 给匹配的字符打上标签
(lov)able\1er/ 模式lov被保存为标签1用\1表示
查找一个字符串lov后跟上able,再跟上lov再接上er即:lovablelover
x{m}和x{m,}和x{m,n}字符x重复出现:m次,至少m次,至少m次,并不超过n次
o{5,10} 匹配包含5~10个o的字符串| 或者
echo "tom and jerry"|sed -r ‘s/(tom) and (jerry)/\2 and \1/‘echo "tom g1,g2,g3 jerry"|cut -d" " -f2
echo "abc def"| sed -r ‘s/([a-z]+) ([a-z]+)/\2 \1/‘
echo "abc def"| sed -r ‘s/([a-Z0-9]+) ([a-Z0-9]+)/\2 \1/‘
echo "abcgood"|grep -E "abc(good)*" --color 匹配abc后有一个或多个good的行
echo "abchidhn"|sed -r ‘s/(.)(.*)/\1/‘ 用()切割字符
echo "abc" |grep -E "abc{3}" {}之前字符c出现的次数为3次
echo "abc defd xyz"|grep -E "\<[a-Z]{3}\>"匹配有三个字母的
echo "abc"| grep -E "abc+" --color
grep -E "^root|^tom" /etc/passwd
echo "abc user@sina.com.cn def"|grep -E "[a-Z0-9._]+@[a-Z0-9.]+\.[a-Z]{2,3}
" --color
ps:HOST=$(/bin/hostname)
将()里的命令执行后的结果赋值给HOST变量
grep awk sed 是基于正则表达式设计的
用双引号将正则表达式引起来
sed 循环 一行一行的处理文件
sed -n ‘/abc/p‘ file 默认会打印模式空间的内容
行中匹配abc的打印出来 -r 支持扩展分割符,-n不让他默认打印模式空间
sed ‘/abc/p‘ file1
读取file1的第一行到pattern space(临时缓冲区, 内存)
对pattern space中的这一行进行/abc/p操作
将pattern space中的这一行打印出来
清空pattern space
读取file1的下一行到pattern space
sed root@10.0.2.253 sed ‘s/abc/def‘ file 远程登录后修改file里的内容
sed -n ‘5p‘ file 把第五行打印出来
sed -n ‘$p‘ file 把最后一行打印出来
sed -n ‘1,3p‘ file 把一到三行打印出来
sed -n ‘1,~3p‘ file 从第一行开始打印三行
sed -n ‘1p; 3p‘ file 打印第一行和第三行
sed -n ‘1,/def/p‘ file 从第一行开始直到碰到def的行全部打印出来
sed -i ‘3i aaaaaaa‘ file 在第三行的前面加上aaaaaaa
sed -i ‘$a aaaaa‘ file 在最后行加入aaaaa
sed -i ‘/^tom/i aaaaaa‘ file 在以tom开头的行前一行加上aaaaaa
sed -i ‘s/abc/def/‘ file 改每一行的第一个abc成def
sed -i ‘s/abc/def/g‘ file 改每一行的所有abc成def
sed -i ‘s/abc/def/3‘ file 改每一行的第三个abc成def
sed -i ‘1,2s/abc/def/‘ file 改一到两行abc成def
sed -i ‘1,2s/^.*$/def/‘ file 改一到两行成def
sed -i ‘4c aaaaaaaaa‘ file 把第四行改为aaaaaaaa
sed -i ‘/^SELINUX/c selinux ‘ 把所有以SELINUX开头的行改为selinux
sed -i ‘/^abc/s/tom/jerry/‘ file 先找到以abc开头的行将这一行的tom改为jerry
sed -i ‘/abc/,/^def/s/123/456/‘ file 将abc开头的行和def开头的行之间的行的123改为456
s 换匹配的字段 c换匹配的行
sed -i ‘4d‘ 把第四行删除
sed -i ‘/^tom/d‘ file 删除以tom开头的所有行
sed -i ‘/^$/d‘ file 删除空行
sed -i ‘/^\s$/d‘ file 删除开头为空行 \s表示空格或tab
sed -i ‘/^mike/s/^/#‘ file 将mike行注释
sed ‘3s/abc/def/; 5s/abc/yyy/g‘ file1
sed ‘s/abc/def/; s/hij/xyz/‘ file1
sed -i -e ‘1s/jerry/tom/; -e 3s/mike/xyz/‘ file 多条一起执行用-e
sed ‘/ADDR/s/^/#/‘ file1 行首加#
sed ‘/ADDR/s/^#//‘ file1 去行首#
sed -ri /^#ServerName.*:80$/s/^#// /etc/selinux/config
找出/etc/seliunx/config文件中以#ServerName开头以:80结尾的行
并将#替换成空白
& 保存查找串以便在替换串中引用
sed ‘s/tom/&jerry/‘ file1
范围匹配
sed ‘/abc/,/xyz/s/tom/jerry/‘ file1 abc到xyz中的
sed ‘/tom/,/jerry/d‘ file1
sed -n ‘/abc/,/xyz/p‘ file1
sed ‘1,/tom/d‘ file1 第1行到第1个匹配tom的行
引用变量
var1="root"
sed "/$var1/c aixocm" file1
sed -ri "/IPADDR/s/[0-9.]+/$ip/" ifcfg-eth0
sed -i "s|^${i}1*|#&|" /etc/fstab
#------------------------------------------------------------------------
awk 按行处理行里字段 循环命令
默认以空格作为分割符 默认打印整行$0 -F分割符 制定分割符
awk ‘BEGIN{print "aaaa"}/tom/{print $2}END{print "bbbbbbb"}‘ file1
先执行BEGIN里的语句 从文件中读取第一行是否匹配/tom如果有则执行没有就不执行
到读完后,再运行END的语句 可以选用BEGIN 匹配项 ENG。
awk ‘/^mike/{print $2}‘ file
awk ‘NR==2{print $2}‘ file NR是行号 NF字段数
awk ‘NR==2||NR==4{print $2}‘ file 只读两个固定的行号
awk ‘{print $0}‘ file $0 整个行
awk ‘BENGIN{FS=":" OFS=" "}/bash$/{print $0}‘ file
FS 指定了分割符
OFS 指定了输出的字段分割符
tr ":" "" 将冒号改为空格
awk ‘BEGIN{i=10;echo$i}‘
awk -v v1=$a -v v2=$b ‘BEGIN{print v1+v2}‘ 将bash的值传给awk
awk -F: -v v1=$a ‘$0~v1‘{print $0} ~ 匹配条件
awk ‘BEGIN{i=0;}{i++}END{print i}‘ file
awk ‘/^root/{$3+=10;print $3}‘ file
awk ‘$1~"root"{print $1}‘ file
awk ‘$1==500{print $1}‘ file 第一个字段为500
awk ‘$NF~"bash"{print $1}‘ file 最后一个字段是否有bash
awk ‘$3>=500&&$3<=503{print $2}‘ file
awk -F: -v v1=$a ‘$1~^v1‘ file 打印出以变量a开头的行
awk -F: ‘{if($1~/^root/)print $1}‘ file 打印出第一个字段以root开头的行的第一个字段
next 直接读下一行
continue
exit 结束不读了
break
int()整数化
awk ‘system("useradd" $2)‘ file system()调用系统的命令
df -Th|grep "/$"|awk ‘{print $6}‘|sed ‘s/%//‘
df后截取某个字段并替换
tr 针对字符进行操作,单字符处理工具, 而不是字符串处理工具
cat file1 | tr "abc" "xyz"
a都替换成x, b都替换成y, c都替换成z,并不是将字符串abc替换成字符串xyz
echo "abc 11a22bc" |tr “abc” “xyz” 结果:xyz 11x22yz
tr "abc" "xyz" <file 处理文件
tr "a-z" "A-Z" <file 将小写字母转成大写字母
tr ":" "\m"
echo "abdcdd"| tr -d "abc"将abc三个字符删除
cat file |tr -d “a-z”
echo “aaaaaaaaxcxxx cccccccc”|tr -s"abc" 将重复的abc字符压缩成一个字符
sort 排序 文件没改变
默认以空白作为分割符以第一个字段进行排序 (按字符串排asic)
sort -n file 以第一个字段的数值排序
sort -r 倒序
sort -k2 以第二个字段排
sort -t:以:分割字段
sort -t: -k3nr /etc/passwd
注意:先sort再uniq
uniq 去重复行 不改变文件
uniq file 只改变相邻的重复行
uniq -c 显示相邻的重复多少行
uniq -u 只显示没有相邻重复的行
cut 分割字符 默认分割符为tab键
cut -d: -f1-f3 file 指定分割符为:只要1 3字段
cut -d: -f1,3,5
echo “addfgg” |cut -c3 取第三个字符
grep
grep -n ”root“ /etc/passwd 过滤出来加行数
grep -c ”root“ /etc/passwd 过滤出来的行号
grep -v ”root“ /etc/passwd 取反
grep -q ”root“ /etc/passwd 过滤出来的不显示
grep -w ”root“ /etc/passwd 过滤出来有单词root的行
grep -o ”root“ /etc/passwd 过滤出来root单词
grep -ro ”root“ 目录 过滤出来目录中文件里的有root的行
grep -i ”root“ /etc/passwd 忽略大小写
grep -E ”root“ /etc/passwd 启用扩展正则
grep -f file file1 过滤出file和file1中共同拥有的行
grep -f file file1 -v 过滤出file有file1没有的行
grep -x ”root“ file 过滤file中只含有root的的行
find
find . -nouser 把没有主人的文件找出来
find . +size +10000c 找出文件大于10000个字节的文件
find / -maxdepth 1 -name “*.conf” -maxdepth 不会找子文件
find . -perm 600 把权限为600的找出来
find . -name “*.sh” |xargs rm -rf {} 把文件找出后交给rm处理
find . -name “*.sh” |xargs -I{} rm -rf {} 用-I 指定用什么表示查出的内容4
trap 屏蔽信号
trap ‘‘ 2 屏蔽中断信号,不做什么
trap ‘ls;pwd;date‘ 2 当出发中断信号(ctrl+c) 执行ls;pwd;date;
trap 2 还原
curl
curl -o a.html http://www.sohu.com/index.html 将搜狐的首页下载下载到a.html
curl -O http://www.sohu.com/index.html 将搜狐的首页下载下来
curl -T file ftp://10.0.2.253/ 将file文件上传到10.0.2.253中 用ftp协议
本文出自 “爱武装一辈子” 博客,请务必保留此出处http://menglinux.blog.51cto.com/8733806/1437330