linux的shell的难点,shell 编程(难题分析)

一、grep

用grep把passwd文档中包含'root'或者‘500’的行过滤出来,并在过滤出来的行前面加上行号.

grep -n 'root\|500' passwd

r.o             如r1o,rto都满足该条件,.表示匹配一个字符,仅仅一个字符

ooo*          如oo,ooo,oooo...都满足该条件,既表示在*前面的一个字符或者n个都满足该条件,计算方法oo+0个o,oo+1个o都满足

r.*t            如rjidsjidishdi/: sjht 在r与t之间任意字符都满足

二、sed的字符位置互换

如将test3:x:505:505::/home/test3:/bin/bash中的test3与bash替换位置,首先需要将这该该段划分,具体划分如下

(test3)(:x:505:505::/home/test3:/bin/)(bash)

1             2             3     #通过括号将该段分为3段

(test3) (         .*        )  (bash)   #第2段通过.*代替

sed 's/\(test3\)\(.*\)\(bash\)/\3\2\1/'  文件名     #替换的方式,“\”表转意

bash:x:505:505::/home/test3:/bin/test3              #执行后的结果

替换中,如果不加g参数,那么只会把查到的第一个匹配的值进行替换,如语句(root:x:0:0:root:/root:/bin/bash)执行了sed 's/r//' 后,得到如下的语句

oot:x:0:0:root:/root:/bin/bash,那么说明只有第一个r被替换为空,其他的则没有影响。

2、把/etc/passwd中出现的第一个数字和最后一个单词替换位置

原始数据

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

--------------------------------------

sed '1,$s/\([0-9]\)\(.*\)\([a-z]\)/\3\2\1/g' passwd

-------------------------------------------------------------

root:x:h:0:root:/root:/bin/bas0

bin:x:n:1:bin:/bin:/sbin/nologi1     #执行的结果是已每一行为一个单位,把出现的第一个数字与最后一个单词执行了替换。

3、在passwd 20行到末行最前面加 'aaa:'

sed '20,$s/\(.*\)/aaa:\1/' passwd    # “(.*)”表示的就是整个

sed '20,$s/\(.*\)/aaa:&/' passwd    #&代表(.*)的内容

执行后的部分结果

aaa:apache:x:48:48:Apache:/var/www:/sbin/nologin

aaa:rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin

aaa:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

aaa:smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

aaa:webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

sed的大小写替换

sed中,使用\u表示大写,\l表示小写

1. 把每个单词的第一个小写字母变大写:

sed 's/\b[a-z]/\u&/g' filename

2. 把所有小写变大写:

sed 's/[a-z]/\u&/g' filename

3. 大写变小写:

sed 's/[A-Z]/\l&/g' filename

三、awk

基础知识:http://www.aminglinux.com/bbs/thread-6833-1-1.html

截取文档中的某段 awk -F ':' '{print $1}' 1.txt也可以使用自定义字符连接每个段 awk -F':' '{print $1"#"$2"#"$3"#"$4}' 1.txt匹配字符或字符串 awk '/oo/' 1.txt针对某个段匹配 awk -F ':' '$1 ~/oo/' 1.txt多次匹配 awk -F ':' '/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/' 1.txt   # $1 ~/test/ 表示匹配内容为第一段为test条件操作符==, >,=;<=awk -F ':' '$3=="0"'  1.txt;awk -F ':' '$3>="500"' 1.txt;awk -F ':' '$7!="/sbin/nologin"'  1.txt;awk -F ':' '$3"5" && $3"5" || $7=="/bin/bash"' 1.txtawk内置变量 NF(段数)  NR(行数)head -n3 1.txt | awk -F ':' '{print NF}'head -n3 1.txt | awk -F ':' '{print $NF}'head -n3 1.txt | awk -F ':' '{print NR}'打印20行以后的行awk 'NR>20' 1.txtawk -F ':' 'NR>20 && $1 ~ /ssh/'  1.txt更改某个段的值awk -F ':' '$1="root"' 1.txt数学计算, 把第三段和第四段值相加,并赋予第七段 awk -F ':' '{$7=$3+$4; print $0}' 1.txt计算第三段的总和 awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txtawk中也可以使用if关键词 awk -F ':' '{if ($1=="root") print $0}' 1.txt

用 ':' 作为分隔符,查找第一段为 'root' 的行,并把该段的 'root' 换成 'toor' (可以连同sed一起使用)

awk -F ':' '$1~/root/' passwd | sed 's/root/toor/g'  #$1~/root/ 表示第一段匹配root的

date +%y-%m-%d  -d "-5day" :表示5天以前,且格式为%y-%m-%d

变量赋值:a = 1 这是错误的,变量的赋值不能有空格,所以赋值方式为:a=1

1.从 a.log 文件中提取包含“WARNING”或”FATAL”,同时不包含“IGNOR”的行,然后,提取以“:”分割的第五个字段?

grep-E ‘WARNING|FATAL’a.log|grep-v’IGNOR’|awk-F:’{print $5 }’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值