首页 > 代码库 > sed,awk

sed,awk

  1. ^ 行首定位符               

    ^love 匹配所有以love开头的行

  2. $  行尾定位符

    love$  匹配所有以love结尾的行

  3. .  单个任意字符

    l..e  匹配以l开始后跟两个字符再跟一个e的字符串

  4. *  重复0到多个星号前面的字符

    a* 匹配0个或多个a的字符串

  5. []匹配一组字符的任意一个

    [Ll]ove  匹配Love或love的字符串

  6. [x-y]匹配指定范围的一个字符

    [A-Z]ove  匹配大写字符开头后跟ove的字符串

  7. [^]匹配不在指定组内的字符

    [^A-Z]  匹配不是大写字母的任意字符

  8. \  转义字符用来转义元字符

    love\.  匹配love后跟一个.的字符

  9. !  取反

  10. + 表示一个或多个

    xyz+ 一个或多个z

  11. ? 表式0个或一个

    xyz? 0个或一个z

  12. RE元字符

    1. \< 词首定位符\<love 匹配love开头的词

    2. |> 词尾定位符love\> 匹配love结尾的词

    3. \<bin\> 匹配一个单词

    4. \(..\) 给匹配的字符打上标签

  13. (lov)able\1er/ 模式lov被保存为标签1用\1表示

    查找一个字符串lov后跟上able,再跟上lov再接上er即:lovablelover

  14. x{m}和x{m,}和x{m,n}字符x重复出现:m次,至少m次,至少m次,并不超过n次
    o{5,10} 匹配包含5~10个o的字符串

  15. | 或者
    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 是基于正则表达式设计的
用双引号将正则表达式引起来

i_f45.gifsed  循环 一行一行的处理文件
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
#------------------------------------------------------------------------
i_f40.gifawk 按行处理行里字段  循环命令
默认以空格作为分割符 默认打印整行$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后截取某个字段并替换

i_f39.giftr 针对字符进行操作,单字符处理工具, 而不是字符串处理工具
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字符压缩成一个字符

i_f45.gifsort 排序  文件没改变
默认以空白作为分割符以第一个字段进行排序 (按字符串排asic)
sort -n file  以第一个字段的数值排序
sort -r 倒序
sort -k2  以第二个字段排
sort -t:以:分割字段
sort -t: -k3nr /etc/passwd

注意:先sort再uniq

i_f39.gifuniq 去重复行 不改变文件
uniq file  只改变相邻的重复行
uniq -c  显示相邻的重复多少行
uniq -u 只显示没有相邻重复的行
i_f40.gifcut  分割字符  默认分割符为tab键
cut -d: -f1-f3  file  指定分割符为:只要1  3字段

cut -d: -f1,3,5

echo  “addfgg” |cut -c3  取第三个字符

i_f39.gifgrep

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的的行
i_f38.giffind

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
i_f40.giftrap 屏蔽信号
trap ‘‘ 2  屏蔽中断信号,不做什么
trap ‘ls;pwd;date‘ 2 当出发中断信号(ctrl+c) 执行ls;pwd;date;
trap 2 还原

i_f45.gifcurl

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