Chinaunix首页 | 论坛 | 博客
  • 博客访问: 532085
  • 博文数量: 95
  • 博客积分: 1573
  • 博客等级: 上尉
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-23 10:46
个人简介

hello world!

文章分类

全部博文(95)

文章存档

2014年(1)

2013年(44)

2012年(50)

分类: LINUX

2012-05-25 14:55:11

 以下为一些sed与awk的截取字符的示例,全为收集和自己工作之中实际用到的。整理以供备查:

--------------------------------------
101 aa bb cc 111 abc 90 aaa
sdf 12 bb abc 111 aaa

如上数据,怎样找出abc前离abc最近的数字
如结果为:
111
12
--------------------------------------
解法:以下的都可以达到其目的
sed -r 's/(.* |^)([0-9]+).*?abc.*/\2/' file
sed -r 's/(.* |^)([0-9]+).*abc.*/\2/' file
awk '{num="";for (i=1;i<=NF;i++) {if ($i=="abc"&&num) print num;if ($i~/[0-9]+/) num=$i}}' file
awk '{for(i=1;i<=NF;i++){if($i ~ /abc/){for(j=i;j>=1;j--){if($j ~ /[0-9]+/){print $j;break}}}}}'
sed -nr 's/.*[ ]([0-9]+)([^0-9]*)abc.*/\1/p'
awk '{for(i=1;i<=NF;i++) if(!($i~/[^0-9]/)) {a[x]=$i} else if($i~/abc/) print a[x]}'
awk '{for (i=1;i<=NF;i++) {if ($i+0>0) a=$i;if ($i=="abc") {print a;break}}}'
sed 's/.*\b\([0-9]\+\).*abc.*/\1/'
awk -F 'abc' '{for (i=split($1,m," +");i>=1;i--) if (m[i]~/[0-9]+/) {print m[i];next}}'
grep -Po "\d+(?=\D+abc)"
sed -r 's/(.* )([0-9]+).*abc.*/\2/'
-------------------------------------
head -5 /etc/passwd | sed -e '1d' # 只我删除地一行
head -5 /etc/passwd | sed -e '1,3d'  # 删除1到3行
head -5 /etc/passwd | sed -e '1d;3d'  # 删除第一 和 第三行
head -5 /etc/passwd | sed -e '/root/d' # 只要包含oot关键字的行都删除
head -5 /etc/passwd | sed -e '/^daemon/d'  # 删除以daemon开头的所有行
head -5 /etc/passwd | sed -e '/nologin$/d'  # 删除以nologin结尾的所有行
cat /etc/inittab | sed -e '/^$/d'  # 删除所有空行 , ^$匹配空行
cat /etc/inittab | sed -e '/^#/d;/^$/d'  # 删除所有以#开头的行以及空行

打印
head -5 /etc/passwd | sed -e '/^root/p'  #  匹配以管理员开头的行都打印,但你会发现匹配的行会打印两次
head -5 /etc/passwd | sed -n -e '/^root/p' # 只打印理员开头的行,但不进行常规打印
head -5 /etc/passwd | sed -n -e '/nologin$/p'
head -5 /etc/passwd | sed -n -e '1,3p'  # 
head -5 /etc/passwd | sed -n -e '/^bin/,/^adm/p'  # 通过正则来定义行的范围
head -5 /etc/passwd | sed -n -e '/^bin/,/^admin/p'
head -5 /etc/passwd | sed -n -e '/^root/,/nologin$/p'

替换 s
head -5 /etc/passwd | sed  -e 's/root/admin/'  # 把每行找到的第一个root关键字都替换成admin
head -5 /etc/passwd | sed  -e 's/root/admin/g' # 把每行找到的所有的oot关键字都替换成admin
head -5 /etc/passwd | sed  -e '2,3s/nologin/deny/g'   # 只把2~3行进行替换
head -5 /etc/passwd | sed  -e '/^root/,/^adm/s/:/-/g' # 正则表示行的范围

修改源文件的
sed -i '/^root/,/^daemon/s/:/-/g' /tmp/test/passwd


使用所谓的 域 进行定位

date "+%m-%d-%Y" | sed -e 's/\(.*\)-\(.*\)-\(.*\)/\3-\1-\2/'
date "+%m-%d-%Y" | sed -r 's/(.*)-(.*)-(.*)/\3-\1-\2/'

# echo 'come on,baby!' | sed -e 's/\(.*\),\(.*\)!/\2,\1!/'
baby,come on!

# echo 'come on,baby!' | sed -r 's/(.*),(.*)!/\2,\1!/'
baby,come on!

删除每行的第一个字符
cat /etc/fstab | sed -e 's/\(.\)\(.*\)/\2/'
或 cat /etc/fstab | sed -e 's/.//'

删除每行的第二个字符
cat /etc/fstab | sed -e 's/\(.\)\(.\)\(.*\)/\1\3/'

删除最后一个字符
cat /etc/fstab | sed -e 's/\(.*\)\(.\)/\1/'

删除导数第二个字符
cat /etc/fstab | sed -e 's/\(.*\)\(.\)\(.\)/\1\3/'

awk将4行合成一行
awk '{if (NR%4==0){print $0} else {printf"%s ",$0}}' filename
另一种方法,主要就在脚本里,命令行不常用:
linecount=4
awk -v n=${linecount} '{if (NR%n==0){print $0} else {printf"%s ",$0}}' filename
=============================
正则表达式
.    一个字符
..    两个字符
^#    以#开头的都匹配
#$    以#结尾的都匹配
[abc]    将与包含小写字符a或者b或者c都匹配
[^abc]    将与不包含小写字母a或者b或者c匹配
h{2}    与hh匹配 , {2}表示重复前面的字符或字符串2次
h{2,3}    与 hh 或 hhh 匹配
h+    匹配至少一个或多个字符h
h*    匹配0或多个h
h?    匹配0或1个h
[a-z]    a到z所有小写字母
[A-Z]    A到Z所有大写字母
[a-Z]    所有字母
[:alnum:]    字母数字
[:blank:]    空格或者制表符
[:digit:]    纯数字
[:lower:]    小写字母
[:upper:]    大写字母
[:punct:]    标点符号


字符串的处理:
  1,截取
  方法一:
  echo $a|awk ’{print substr( ,1,8)}’
  substr是awk中的一个子函数,对第一个参数的进行截取,从第一个字符开始,共截取8个字符,如果不够就从第二个字符中补充
  方法二
  echo $a|cut -b2-8
  cut:对标准输入的字符串进行处理
  cut -bn-m:以byte为单位,从第n个byte开始,取m个
  cut -bn,m:以byte为单位,截取第n,m个byte
  cut -b-n,m:以byte为单位,截取1-n,和第m个
  -c:以charactor为单位
  -d:指定分隔符,默认为tab
  -s:使标准输入中没有delimeter
  cut -f1:截取第1个域
eg. lspci -nn|cut -d "[" -f3 |grep $VAR

  方法三
  a=123456
  echo $
  方法四
  使用sed截取字符串的最后两位
  echo $test |sed ’s//(.*/)/(../)$//’
  截取字符串的前2位
  echo $test |sed ’s/^/(../)/(.*/)//’
  2,比较
  好像没有什么可以比较的
  3,连接
  $a$b
  或者
  $string
  4,翻转
  方法一:
  使用rev命令
  方法二:
  编写脚本实现
  #!/usr/bin/awk -f
  ################################################################
  # Description : duplicate rev in awk
  ################################################################
  {
  revline = ""
  for (i=1;i<=length;i++)
  {
  revline = substr(,i,1) revline
  }
  }
  END{print revline}
  5,匹配
  grep
  egrep
  fgrep
  6,排序
  7,替换
  bash中:
  %x=abcdabcd 
  %echo $ # 只替换一个 
  bbcdabcd 
  %echo $ # 替换所有 
  bbcdbbcd 
  sh中:
  ??
  如何替换/
  使用sed
  替换所有匹配
  echo $test |sed ’s/xx/yy’
  替换单个匹配
  ??
  8,得到字符串的长度:
  bash当中
  $
  或者
  expr "$VAR" : ’.*’
  9,判断字符串是否为数字
  10,得到字符串中某个字符的重复次数
  echo $a |tr "x" "/n" |wc -l
  得到的结果需要减去1
  或者
  echo $a |awk -F"x" ’{print NF-1}’
  11,得到字符串中某个string的重复次数
  12,将一批文件中的所有string替换
  for i in file_list 
  do 
  vi $i <<-! 
  :g/xxxx/s//XXXX/g 
  :wq 
  ! 
  done
  13,如何将字符串内每两个字符中间插入一个字符
  使用sed
  echo $test |sed ’s/../&[insert char]/g’

阅读(4191) | 评论(0) | 转发(0) |
0

上一篇:selinux

下一篇:dd命令详解(清除硬盘数据)

给主人留下些什么吧!~~