一、基础知识:http://www.aminglinux.com/bbs/thread-6833-1-1.html
一、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<$4' 1.txt ;
awk -F ':' '$3>"5" && $3<"7"' 1.txt
awk -F ':' '$3>"5" || $7=="/bin/bash"' 1.txt
awk内置变量 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.txt
awk -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.txt
awk中也可以使用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 }’