温故知新
1、总结sed和awk的详细用法;
sed stream EDitor 流编辑器,行级
sed [option] …’script’ [input-file]
script
地址定界编辑命令
常用选项
-n 静默模式 ,不输出模式空间中的内容至屏幕
-e script –expression ,多点编辑
-f /pat/to/sed-script 每行一个编辑命令的sed脚本
-r –regexp-extended 支持扩展正则表达式(默认是正则表达式)
-i 将直接修改原文件
地址定界
1、不给地址:空地址 对全文进行处理
2、单地址:
指定行
/pattern/ 被此模式匹配的所有行
3、地址范围
,# 绝对地址范围
,+# 相对地址范围
,/pat1/
$ 最后一行
/pat1/,/pat1/
4、步进 ~
1~2 所有奇数行
2~2 所有偶数行
编辑命令
d 删除匹配到的字段或行
p 显示匹配到的字段
a \text 在行后面追加文本text 支持使用\n进行多行追加
i \text 在行前面插入文本 支持使用\n进行多行追加
c \text 把匹配到的行替换为此处指定的文本
w /path/to/file 保存匹配到的行至指定文本中
r /path/from/file 读取指定文件到当前文件被匹配到的行处
= 被匹配的行打印行号
! 条件取反;地址定界!编辑命令
s/// 查找替换,分隔符可自行指定
替换标记
g 全局替换
w /path/to/file 将替换成功的结果保存至指定文件中
p 显示替换成功的行
高级编辑命令
h:把模式空间中的内容覆盖至保持空间
H:把模式空间的内容追加至保持空间
g:把保持空间的内容覆盖至模式空间中
G:把保持空间的内容追加至模式空间
x:互换保持空间内容和模式空间的内容
n 覆盖读取匹配的行的下一行至模式空间
N 追加读取匹配到的行的下一行至模式空间中
d 删除模式空间中的行
D 删除多行模式空间中的所有行
awk,gawk
基本用法:
awk [option] ‘program’ FILE…
[option]
-F:指明输入时用到的字段分割符(默认是空白字符)
-v var-value:自定义变量
$1,..$NF:内置变量,第一段。。。
$0:显示整行
program:PATTERN{ACTION STATEMENTS}
语句之间用分号分割
此时的模式相当于地址定界
ACCTION
print,printf
变量替换时不能被引号包含
输出命令:
1、print item1,item2
多字段之间使用逗号分割
输出时显示的是空白符,输出的item可以使字符串,数值,记录的字段,变量,awk的表达式
如省略item,打印整行字符,相当于print $0
2、变量
内建变量:
FS:input field seperator:输入时的分隔字符:默认是空白字符
OFS:output field seperator:输出时的分隔字符:默认是空白字符
RS:input record seperator,输入的换行符
ORS:output record seperator,输出时的换行符
NF:number of field;字段数量
NR:number of record;文件行数
FNR:file number of record ;文件行数(对个文件单独计数)
FILENAME:当前正在处理的文件文件名
ARGC:命令行参数个数
ARGV:数组,保存了命令行中给定的各参数
自定义变量:
1、-v var=value
变量名区分字符大小写
2、PRORGARM定义
3、printf命令
格式化输出: printf FORMAT, intem1,intem2….
1、FORMAT必须要给出
2、不会自动换行,需要显式给出换行控制符,\n
3、FORMAT需要分别给后面的每一个item指定一个格式化符号
格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制证书
%e,%E:科学计数法数值显示
%F:显示为浮点数
%g,%G,以科学计数法或浮点数显示数值
%s:显示字符串
%u:无符号整数
%%:显示%号
修饰符:
[.#]:第一个数字控制显示的宽度(默认右对齐),第二个字符显示小数点后的精度
%3.1f
– :左对齐
+ :显示数值的符号
4、操作符
算数操作符
+加 -减 乘 /除 ^乘方 %取模
字符串操作符:没有符号的操作符,表示字符串连接
赋值操作符
=,+=.-=,=,%=,^=,/=
++,–
比较操作符
>,<,<=,>=,!=,==
模式匹配符
~ 左侧的字符串是否匹配右侧字符串
!~ 不匹配
逻辑操作符
&&
||
!
函数调用
funciton_name(argu1,argu2)
条件表达式
selector?if-ture-expression:if-false-expression
5、PATTERN
1、empty:空模式:处理文本的每一行
2、/regular expression/ :正则表达式:仅处理能够被匹配到的行
3、relational expression :关系表达式,结果有真有假,结果为才被处理
真:结果为非0值,非空字符串
4、line ranges:行范围
startline,endline:/part1/,/part2/
注意:不支持直接给出数字的格式
5、BEGIN/END模式
BEGIN{} :表示仅在开始处理文件中的每一行文本之前执行一次的程序
END{} :表示仅在文本处理完成之后执行一次
6、常用的ACTION
1、EXPRESSIONS:表达式
2、control statements:控制语句:if,while等
3、compound statements:组合语句
4、input statements
5、output statements
7、控制语句
if(condition){statements}
if(condition){statements}else{statements}
使用场景:对awk取得的整行或某个字段做条件判断;
示例:
~]# awk -F: ‘{if($3>=1000) {printf “Common user: %s\n”,$1} else {printf “root or Sysuser: %s\n”,$1}}’ /etc/passwd
~]# awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
~]# awk ‘{if(NF>5) print $0}’ /etc/fstab
~]# df -h | awk -F[%] ‘/^\/dev/{print $1}’ | awk ‘{if($NF>=20) print $1}’
while(condition){statements}
条件“真”,进入循环;条件“假”,退出循环;
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
示例
~]# awk ‘/^[[:space:]]linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}’ /etc/grub2.cfg
~]# awk ‘/^[[:space:]]linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}’ /etc/grub2.cfg
do {statements} while condition
意义:至少执行一次循环体
for(expr1;expr2;expr3){statements}
特殊用法
能够遍历数组中的元素;
语法:for(var in array) {for-body}
switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
break
continue
next
提前结束对本行的处理而直接进入下一行
awk -F: ‘{if ($3%2!=0) next; print $1,$3}’ /etc/passwd
delete array[index]
exit
{statements}
8、array
支持关联数组:array[index-expression]
index-expression
1、可使用任意字符串,字符串需要使用双引号
2、如果某数组元数事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为空(若要判断数组中是否存在某元素,要使用 “index in array”格式进行
3、要遍历数组中的每一个元素,要使用for循环
for(var in array) {for-body}
var会遍历array的每个索引
9、函数
内置函数
常用:
1、数值处理
rand():第一次使用时返回0和1之间的一个随机数,以后都是此数值
2、字符串处理
length([s]):返回指定字符串的长度
sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;
split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;
2、删除/boot/grub/grub.conf文件中所有行的行首的空白字符;
[root@localhost ~]# sed -n /^[[:space:]]/p grub.conf
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-358.el6.x86_64.img
[root@localhost ~]# sed -i ‘s/^[[:space:]]//’ grub.conf
3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;
[root@localhost ~]# sed -i ‘s/^#[[:space:]]//’ fstab
4、把/etc/fstab文件的奇数行另存为/tmp/fstab.3;
[root@localhost ~]# sed -n ‘ 1~2w /tmp/fstab.3’ /etc/fstab
5、echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;
[root@localhost ~]# echo “/usr/local/mysql/mysql.sh/” | sed -r ‘s@^/./([^/]+)/?$@\1@’
mysql.sh
[root@localhost ~]# echo “/usr/local/mysql/mysql.sh” | sed ‘s/.\///’
mysql.sh
[root@localhost ~]# echo “/usr/local/mysql” | sed -r ‘s@^(/.*/)[^/]+/?$@\1@’
/usr/local/
6、统计指定文件中所有行中每个单词出现的次数;
]# awk ‘{ for (i=1;i<NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}’ /etc/fstab
7、统计当前系统上所有tcp连接的各种状态的个数;
]# netstat -tna| awk ‘/^tcp\>/ {state[$NF]++}END{for (i in state) {print i,state[i]}}’
8、统计指定的web访问日志中各ip的资源访问次数:
[root@VS27 CCTV4]# awk ‘{ip[$1]++}END {for (i in ip){print i,ip[i]}}’ /var/log/access.log
9、写一个脚本:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数;
!/bin/bash
declare -a LOG
LOG1=ls /var/log/*.log
LOG=($LOG1)
echo ${#LOG[@]}
echo ${LOG[@]}
for i in ${LOG[*]}; do
awk ‘END {print FILENAME,NR}’ $i
done
10、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数;
!/bin/bash
declare -a NAME
NAME=(one two three four five six seven )
if [ $1 <= ${#NAME[@]} ]; then
if [ -z $1 ] ;then
NUM=expr $RANDOM % ${#NAME[@]}
echo ${NAME[$NUM]}
else
for ((i=1;i<=$1;i++));do
NUM=expr $RANDOM % ${#NAME[@]}
CHIOSE[$i]=${NAME[$NUM]}
NAME[$NUM]=${NAME[${#NAME[]} – 1]}
unset NAME[$[${#NAME[@]} – 1]]
done
echo ${CHIOSE[@]}
fi
else
echo “your chiose is too big”
exit 1
fi
11、授权centos用户可以运行fdisk命令完成磁盘管理,以及使用mkfs或mke2fs实现文件系统管理;
[root@localhost ~]# vim /etc/sudoers
centos ALL=(root) NOPASSWD: /sbin/fdisk, /sbin/mke2fs, /sbin/mkfs
12、授权gentoo用户可以运行逻辑卷管理的相关命令;
[root@localhost ~]# visudo
Cmnd_Alias LVADMINS_CMD=/sbin/lvchange,/sbin/lvdisplay,/sbin/lvmchange,/sbin/lvmdiskscan,/sbin/lvmsadc,/sbin/lvremove,
/sbin/lvs,/sbin/lvconvert,/sbin/lvextend,/sbin/lvmconf,/sbin/lvmdump,/sbin/lvmsar,/sbin/lvrename,/sbin/lvscan,/sbin/lv
create,/sbin/lvm,/sbin/lvmconfig,/sbin/lvmetad,/sbin/lvreduce,/sbin/lvresize,/sbin/pvchange,/sbin/pvck,/sbin/pvcreate,
/sbin/pvdisplay,/sbin/pvmove,/sbin/pvremove,/sbin/pvresize,/sbin/pvs,/sbin/pvscan,/sbin/vgcfgbackup,/sbin/vgck,/sbin/v
gdisplay,/sbin/vgimport,/sbin/vgmknodes,/sbin/vgrename,/sbin/vgsplit,/sbin/vgcfgrestore,/sbin/vgconvert,/sbin/vgexport
,/sbin/vgimportclone,/sbin/vgreduce,/sbin/vgs,/sbin/vgchange,/sbin/vgcreate,/sbin/vgextend,/sbin/vgmerge,/sbin/vgremov
e,/sbin/vgscan #使用命令别名LVADMINS_CMD定义相关的命令
gentoo ALL=(ALL) NOPASSWD:LVADMINS_CMD
13、基于pam_time.so模块,限制用户通过sshd服务远程登录只能在工作时间进行;
[root@localhost ~]# vim /etc/security/time.conf
sshd;;!root;MoTuWeThFr0900-1800
[root@localhost ~]# vim /etc/pam.d/sshd
account required pam_time.so
14、基于pam_listfile.so模块,定义仅某些用户,或某些组内的用户可登录系统;
[root@localhost ~]# vim /etc/sshd_userlist
root
user1
user2
[root@localhost ~]# chmod 600 /etc/sshd_userlist
[root@localhost ~]# chown root /etc/sshd_userlist
[root@localhost ~]# vim /etc/pam.d/sshd
auth required pam_listfile.so item=user sense=allow file=/etc/sshd_userlist onerr=succeed
原创文章,作者:胡安慧,如若转载,请注明出处:http://www.178linux.com/78307