1、总结sed和awk的详细用法
sed: 语法结构 sed [OPTION]...'script' [input-file]...[action] -r:支持扩展正则表达式 -n:不输出模式空间中的内容至屏幕 -e script1 -e script2 -e script3:指定多脚本运行 -f /path/to/script_file:从指定的文件中读取脚本运行 -i:直接修改源文件 sed的地址定界 #:#表示数字,指定行 $:最后一行 /pattern/或%pattern%:任何能被pattern匹配到的行 #,/pattern/:从第#行开始,到第一次被pattern匹配到的行结束,中间的所有行 #1,#2:从#1到#2行 /pattern1/,/pattern2/:从第一次被pattern1匹配到的行开始,到第一次被pattern2匹配到的行结束,中间的所有行 #,+n:从#行开始,一直到向下的n行 1~2:所有奇数行 2~2:所有偶数行 sed的编辑命令 d:删除模式空间中的行 =:为模式空间中的行打印行号 a \text:在行后面追加文本,支持使用\n实现多行追加 i \text:在行前面追加文本,支持使用\n实现多行追加 c \text:用text替换匹配到的行 p:打印模式空间中的行 s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等; 替换标记: g:全局替换; w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中; p:显示替换成功的行; w /path/to/somefile:保存模式空间匹配到的行至指定的文件中; r /path/from/somefile:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并; 高级编辑命令: h:把模式空间中的内容覆盖至保持空间中; H:把模式空间中的内容追加至保持空间中; g:把保持空间中的内容覆盖至模式空间中; G:把保持空间中的内容追加至模式空间中; x:把模式空间中的内容与保持空间中的内容互换; n:覆盖读取匹配到的行的下一行至模式空间中; N:追加读取匹配到的行的下一行至模式空间中; d:删除模式空间中的行; D:删除多行模式空间中的所有行; awk: awk的运行模式有三种: (1)awk 命令行 # awk (2)awk 程序文件 # awk -f /path/from/awk_script (3)awk 脚本 # !/bin/awk -f awk的基本用法:awk [OPTION] 'program' FILE1 FILE2... 其中program:PATTERN{Action STATEMENT} program:编程语言 PATTERN:模式 ACTION STATEMENT:动作语句,可以是由多个语句组成,各语句间使用分号隔离; OPTONS: -F[]:指明输入字段分隔符; -v VAR_NAME=VALUE:变量赋值; -f /PATH/FROM/AWK_SCRIPT; awk在处理文本时也是一次读取一行文本,然后根据输入分隔符(默认为空格)进行切片,切成n个片段,然后将每一片都赋予awk内部的一个变量中进行保存, 这些变量名为$1、$2、$3...,awk就可以对这些片段单独处理, awk的输出命令之print 用法:print item1,item2,... item:字符串,用引号引用 print "hello","world" 变量:显示变量的值,可以直接使用变量的名进行引用 print name 数值:无需加引号 注: (1)各item之间要使用逗号隔开,输出时的分隔符默认为空白字符 (2)输出的各item可以为字符串或数值,当前记录的字段($#),变量或awk的表达式;数值会被隐式转换为字符串进行输出 (3)print后面的item省略时,相当于运行“print $0”,用于输出整行 (4)输出空白字符 print " " 变量 分为内建变量和自定义变量 内建变量: FS:input Field Seperator,输入字段分隔符,默认为空白字符 RS:input Record Seperator,输入时的行分隔符,默认为换行符 OFS:Output Field Seperatro,输出时的字段分隔符,默认为空白字符 ORS:Output Record Seperator,输出时的行分隔符,默认为换行符 NF:number of field in current record,当前行的字段数 print NF:显示当前行的字段数 print $NF:显示当前行的第NF字段的值 NR:number of records,行数;命令后跟的所有文件将统一合并计数 FNR:行数,各文件单独计数 FILENAME:当前正被awk读取的文件的文件名 ARGC:awk命令行中的参数的个数 ARGV:数组,保存了命令行参数本身 ARGV[index] ARGV[0],ARGV[1] 自定义变量 (1)-v VAR_NAME=VALUE变量名区分字符大小写 (2)在program中自定义变量 awk的输出命令之printf格式化输出 语法:printf FORMAT,item1,item2,... 注: (1)必须提供FORMAT (2)与print语句不同,printf不会自动换行,需要显示指定换行符:\n (3)FORMAT中需要分别为后面的每个item指定一个格式符,否则item无法显示 格式符:都以%开头,后面跟单个字符 %c:显示字符的ASCII码 %d,%i:显示为十进制整数 %e,%E:科学计数法或浮点数格式显示数值 %f:显示为浮点数 %g,%G:以科学计数法或浮点数格式显示数值 %s:显示为字符串 %u:显示无符号整数 %%:显示%符号自身 awk的操作符: awk的操作符有:算术操作符、字符操作符、赋值操作符、比较操作符、模式匹配操作符、逻辑操作符、条件表达式和函数调用 算术操作符:实现一些算术运算 字符操作符:字符串连接 赋值操作符:通常为变量的赋值 =,+=,-=,*=,/=,%=,^= ++,-- 比较操作符:字符串或者数值的大小比较 >,>=,<,<=,==,!= 模式匹配操作符:根据右侧的模式进行匹配操作 ~:是否能由右侧指定的模式所匹配 !~:是否不能由右侧指定的模式所匹配 逻辑操作符:进行逻辑的运算 &&:与运算 ||:或运算 条件表达式: selector?if-trun-expression:if-false-expression 函数调用:调用函数来进行数据的处理 格式:function_name(argu1,argu2,...) PATTERN (1)empty:空模式,匹配每一行; (2)/regular expression/:仅处理能够被此处的模式匹配到的行; (3)relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理; 真:结果为非0值,非空字符串; (4)line ranges:行范围, startline,endline:/pat1/,/pat2/ 注意: 不支持直接给出数字的格式 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd (5)BEGIN/END模式 BEGIN{}: 仅在开始处理文件中的文本之前执行一次; END{}:仅在文本处理完成之后执行一次; 常用的action (1)Expressions (2)Control statements:if, while等; (3)Compound statements:组合语句; (4)input statements (5)output statements 控制语句 if(condition) {statments} if(condition) {statments} else {statements} while(conditon) {statments} do {statements} while(condition) for(expr1;expr2;expr3) {statements} break continue delete array[index] delete array exit { statements } 数组 关联数组:array[index-expression] index-expression: (1)可使用任意字符串;字符串要使用双引号; (2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”; 若要判断数组中是否存在某元素,要使用"index in array"格式进行; weekdays["mon"]="Monday" 若要遍历数组中的每个元素,要使用for循环; for(var in array) {for-body} 函数 内置函数 数值处理: rand():返回0和1之间一个随机数; 字符串处理: 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文件中所有行的行首的空白字符
# sed -r 's/^[[:space:]]+//' /boot/grub/grub.conf
3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符
# sed -r 's/^[#][[:space:]]+//' /etc/fstab # /etc/fstab Created by anaconda on Thu Jun 15 06:05:04 2017 # Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 / xfs defaults 0 0 UUID=b03e3066-407e-445a-8e11-08a1d91d042d /boot xfs defaults 0 0 UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap swap defaults 0 0
4、把/etc/fstab文件的奇数行另存为/tmp/fstab.3
# sed '1~2w /tmp/fstab.3' /etc/fstab # cat /tmp/fstab.3 # /etc/fstab # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 / xfs defaults 0 0 UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap swap defaults 0 0
5、echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名
# echo "/etc/fstab/xxxx/" | sed -r 's@^.*/([^/]+)/?$@\1@' xxxx
6、统计指定文件中所有行中每个单词出现的次数
# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' /PATH/TO/SOMEFILE
7、统计当前系统上所有tcp连接的各种状态的个数
# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state){print i,state[i]}}'
8、统计指定的web访问日志中各ip的资源访问次数
awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/wp.access
9、写一个脚本:定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数
# vim logcount.sh #!/bin/bash # declare -a rows declare -a FileNames for i in /var/log/*.log; do rows=$(cat $i | wc -l) FileNames=${i##*/} printf "%-30s %s\n" $FileNames $rows done # bash -n logcount.sh # bash logcount.sh boot.log 236 vmware-vmsvc.log 413 vmware-vmusr.log 21 wpa_supplicant.log 19 Xorg.0.log 404 yum.log 723
10、写一个脚本,能从所有同学中随机挑选一个同学回答问题;进一步地:可接受一个参数,做为要挑选的同学的个数
#!/bin/bash # declare -a Students Students=(Jose David Antonio Eric Victor Luke Ander Paul Michael Lukaku Mkhitaryan Rashford) read -p "Please chose a number [1-${#Students[@]}]: " num if [[ $num -lt 1 || $num -gt 12 ]];then echo -e "An error choise!\nPlease chose from 1-${#Students[@]}" exit 2 else for ((i=0;i<$num;i++)) do x=$[$RANDOM % ${#Students[@]}] echo ${Students[$x]} Students[$x]=${Students[${#Students[@]}-1]} unset Students[${#Students[@]}-1] done fi # bash students.sh Please chose a number [1-12]: 4 Eric Ander Lukaku Antonio
11、授权centos用户可以运行fdisk命令完成磁盘管理,以及使用mkfs或mke2fs实现文件系统管理
# visudo centos ALL=(root) /sbin/fdisk, /sbin/mkfs, /sbin/mke2fs
12、授权gentoo用户可以运行逻辑卷管理的相关命令
# visudoCmnd_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/lvcreate,/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/vgdisplay,/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/vgremove,/sbin/vgscan gentoo ALL=(ALL) NOPASSWD:LVADMINS_CMD
13、基于pam_time.so模块,限制用户通过sshd服务远程登录只能在工作时间进行
# vim /etc/pam.d/sshd account required pam_time.so # vim /etc/security/time.conf sshd;*;*;MoTuWeThFr0900-1800
14、基于pam_listfile.so模块,定义仅某些用户,或某些组内的用户可登录系统
# vim /etc/user_list centos fedora # chmod 600 /etc/sshd_userlist # vim /etc/pam.d/sshd auth required item=user sense=allow file=/etc/users onerr=succeed
原创文章,作者:浙江-咲,如若转载,请注明出处:http://www.178linux.com/80423
评论列表(1条)
sed, awk在手,天下我有,加油。