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
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用户可以运行逻辑卷管理的相关命令
# 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
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