1、总结sed和awk的详细用法;
a).sed命令
sed可以实现grep的大部分功能,而且还可以查找替换 [root@localhost ~]# sed '10'p -n 1.txt [root@localhost ~]# sed '1,4'p -n 1.txt [root@localhost ~]# sed '5,$'p -n 1.txt 说明:这里的p是print的意思,加上-n后就可以只打印符合规则的行,如果不加则会把1.txt从头到尾打印一遍。 '10'p 打印第 10 行 '1,4'p 打印 1 到 4 行 '5,$'p 打印 5 到末行 打印包 含某个字符串的行 [root@localhost ~]# sed -n '/root/'p 1.txt 可以使用 ^ . * $ 等特殊符号 [root@localhost ~]# sed -n '/ro.t/'p 1.txt [root@localhost ~]# sed -n '/^roo/'p 1.txt [root@localhost ~]# sed -n -r '/ro+/'p 1.txt [root@localhost ~]# sed -n '/ro\+/'p 1.txt 上面两个命令的效果是一样的。 “-e”可以实现同时进行多个任务、也可以用“;”实现 [root@localhost ~]# sed -e '/root/p' -e '/body/p' -n 1.txt [root@localhost ~]# sed '/root/p; /body/p' -n 1.txt 删除指定行 [root@localhost ~]# sed '/root/d' 1.txt; sed '1d' 1.txt; sed '1,10d' 1.txt 说明:'/root/d' 删除包含 root 的行;'1d'或者'1'd 删除第一行;'1,10'd 删除 1 到 10 行 替换功能 [root@localhost ~]# sed '1,2s/ot/to/g' 1.txt 说明:s就是替换的意思,g为全局替换,否则只替换第一次的,/也可以为# @等 [root@localhost ~]# sed '1,2s@ot@to@g' 1.txt 删除所有数字 [root@localhost ~]# sed 's/[0-9]//g' 1.txt 说明: 其实就是把所有数字替换为空字符 删除所有非数字 [root@localhost ~]# sed 's/[^0-9]//g' 1.txt 调换两个字符串位置 [root@localhost ~]# head -n2 1.txt |sed -r 's/(root)(.*)(bash)/\3\2\1/' 说明:在 sed 中可以用()去表示一个整体,本例中把 root 和 bash 调换位置,后面的\1\2\3 分别表示第一个小括号里面的,第二个小括号里面的以及第三个小括号里面的内容。 -i 选项可 以直接修改文件内容 [root@localhost ~]# sed -i 's/ot/to/g' 1.txt
b).awk命令
截取文档中的某段 [root@localhost ~]# awk -F ':' '{print $1}' 1.txt 说明: -F 指定分隔符号为: 也可以使用自定义字符连接每个段 [root@localhost ~]# awk -F':' '{print $1"#"$2"#"$3"#"$4}' 1.txt 或者使用 awk 内部变量 OFS,格式如下: # awk -F ':' '{OFS="#"} {print $1,$2,$3,$4}' 1.txt 匹配字符或字符串 [root@localhost ~]# awk '/oo/' 1.txt 针对某个段匹配 [root@localhost ~]# awk -F ':' '$1 ~/oo/' 1.txt 多次匹配 [root@localhost ~]# awk -F ':' '/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/' 1.txt 条件操作符==, >,<,!=,>=;<= 第三段为 0 [root@localhost ~]# awk -F ':' '$3=="0"' 1.txt; 第三段大于等于 500 [root@localhost ~]# awk -F ':' '$3>=500' 1.txt; 说明:当比较数字时,不能加双引号,如果写成$3>="500"就不符合我们的需求了。 第七段不是'/sbin/nologin' [root@localhost ~]# awk -F ':' '$7!="/sbin/nologin"' 1.txt; 第三段小于第四段 [root@localhost ~]# awk -F ':' '$3<$4' 1.txt ; 第三段大于 5,并且第三段小于 7 [root@localhost ~]# awk -F ':' '$3>5 && $3<7' 1.txt 第三段大于 5 或者第七段为'/bin/bash' [root@localhost ~]# awk -F ':' '$3>"5" || $7=="/bin/bash"' 1.txt awk 内置变量 NF( 段数) NR( 行数) [root@localhost ~]# head -n3 1.txt | awk -F ':' '{print NF}' [root@localhost ~]# head -n3 1.txt | awk -F ':' '{print $NF}' [root@localhost ~]# head -n3 1.txt | awk -F ':' '{print NR}' 打印 20 行以后的行 [root@localhost ~]# awk 'NR>20' 1.txt 打印 20 行以后并且第一段包含'ssh'的行 [root@localhost ~]# awk -F ':' 'NR>20 && $1 ~ /ssh/' 1.txt 更改某个段的值 [root@localhost ~]# awk -F ':' '$1="root"' 1.txt 数学计算, 把第三段和第四段值相加,并赋予第七段 [root@localhost ~]# awk -F ':' '{$7=$3+$4; print $0}' 1.txt 但是这样的话,相当于改变了原来文本的结构,所以 print $0 的时候就不再有分隔符显示。如果想显 示分隔符需要借助 OFS [root@localhost ~]# awk -F ':' '{OFS=":"} {$7=$3+$4; print $0}' 1.txt 计算第三段的总和 [root@localhost ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt awk 中也可以使用 if 关键词 [root@localhost ~]# awk -F ':' '{if ($1=="root") print $0}' 1.txt
2、删除/boot/grub/grub.conf文件中所有行的行首的空白字符;
sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf
3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;
sed 's@^#[[:space:]]\+@@' /etc/fstab
4、把/etc/fstab文件的奇数行另存为/tmp/fstab.3;
sed 'n;d' /etc/fstab >> /tmp/fstab.3
5、echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;
echo "/etc/fstab" | sed 's@[^/]\+/\?$@@'
6、统计指定文件中所有行中每个单词出现的次数;
awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
7、统计当前系统上所有tcp连接的各种状态的个数;
netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c
8、统计指定的web访问日志中各ip的资源访问次数:
# vim test.sh #!/bin/bash # cat access.log |sed -rn '/16\/Aug\/2015/p' > a.txt #统计test.txt里面有多少个ip访问 cat test.txt |awk '{print $1}'|sort |uniq > ipnum.txt #通过shell统计每个ip访问次数 for i in `cat ipnum.txt` do iptj=`cat access.log |grep $i | grep -v 400 |wc -l` echo "ip地址"$i"在2016-08-15日当天累计请求次数为"$iptj"次,平均每分钟请求次数为:"$(($iptj/1440)) >> result.txt done
9、写一个脚本:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数;
#!/bin/bash # Arraywc=(/var/log/*.log) for i in $(seq 0 $[${#Arraywc[@]}-1]) #do wc -l ${Arraywc[i]} do wc -l ${Arraywc[i]} >> /tmp/log.wc done awk '{printf "%-32s%s\n",$2,$1}' /tmp/log.wc rm /tmp/log.wc
10、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数;
#!/bin/bash student=(a b c d e f g h i j k) i=$[$RANDOM % ${#student[@]}] echo ${student[i]}
进一步地:
#!/bin/bash # students=(a b c d e f g h i j k) read -t 5 -p "Please input the number of students: " num if [[ $num -le ${#students[@]} ]] then for ((i=0;i<num;i++)) do x=$[$RANDOM % ${#students[@]}] echo ${students[$x]} students[$x]=${students[${#students[@]}-1]} unset students[${#students[@]}-1] #这样删就不会再选到这个索引号 #unset students[$x] 这个删除只删除了元素的值,但索引号仍在值为空 done else echo "Error";exit fi
11、授权centos用户可以运行fdisk命令完成磁盘管理,以及使用mkfs或mke2fs实现文件系统管理;
centos ALL=(root) NOPASSWD: /sbin/fdisk, /sbin/mke2fs, /sbin/mkfs
12、授权gentoo用户可以运行逻辑卷管理的相关命令;
gentoo ALL=(root) lvm
13、基于pam_time.so模块,限制用户通过sshd服务远程登录只能在工作时间进行;
(1).# vim /etc/pam.d/sshd 在account required pam_nologin.so上插入一行: account required pam_time.so (2).编辑pam_time.so模块的配置文件 # vim /etc/security/time.conf *;*;*;MoTuWeThFr0900-1800 上面表示工作时间的9点到下午6点允许访问ssh
14、基于pam_listfile.so模块,定义仅某些用户,或某些组内的用户可登录系统;
创建一个用户的列表文件,例如/etc/sshd_userlist,然后编辑文件 root centos gentoo 然后修改文件的权限和属主 # chmod 600 /etc/sshd_userlist # chown root /etc/sshd_userlist 再编辑/etc/pam.d/sshd文件,加入以下一行内容: auth required pam_listfile.so item=user sense=allow file=/etc/sshd_userlist onerr=succeed
然后再次登录时,只允许文件中定义的root、centos和gentoo用户登录。
原创文章,作者:Net19_口香糖,如若转载,请注明出处:http://www.178linux.com/36381
评论列表(1条)
写的很好,排版也很棒,加油