N26-第十五周

温故知新
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 &nbsp;$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

(0)
胡安慧胡安慧
上一篇 2017-08-23 17:20
下一篇 2017-08-24 16:51

相关推荐

  • N25-第二周作业

    ①Linux文件管理命令常用方法 Linux常见文件类型 -:files,常规文件 d: directory,目录文件 b: block device,块设备文件 c:character device,字符设备文件 l:symbolic link,符号链接文件 p: pipe,命名管道 s: socket,套接字文件 命令管理工具指南:cp、rm、mv 1.…

    Linux干货 2016-12-13
  • N25期–第十周作业

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 启动过程 (PC架构)    POST –> Boot Sequence(BIOS) –> Boot Loader (MBR)–>GRUB—> Kernel(ramdisk) –> ro…

    Linux干货 2017-03-13
  • 第一周作业

    计算机的组成以CPU/存储/IO设备 硬件层次 CPU以完成运算和控制 存储包含 I/O设备为连接计算机的多样性输入输出设备(包含打印机/显示器等) 软件层次 以机器语言为基础,到符合使用的应用程序, Linux的发行版本 RedHat(商业组织维护版本,有enterprise version)-CentOS-主要以此为主 Debian(community)…

    Linux干货 2016-12-04
  • bash脚本之数组及字符串切片,登陆配置文件

    一,概述 数组(就是一堆变量的集合) 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合/ 数组名和索引     索引:编号从0开始,属于数值索引     注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后…

    Linux干货 2016-09-01
  • linux基础学习-第六天

    2016-08-02 授课内容: 用户和组管理命令 理解并设置文件权限 默认权限 特殊权限 文件ACL 用户和组管理命令 用户和组的配置文件:/etc/default/useradd(相当于useradd -D)、/etc/skel(创建用户的家目录配置文件)、/etc/login.defs(修改用户的密码策略配置) /etc/default/useradd…

    Linux干货 2016-08-04
  • Linux的自动化安装实现

    在介绍自动化安装系统之前让我们来回顾一下系统的启动流程,系统的启动大概分为一下几个步骤:加电自检 boot sequence(mbr)— boot loader –>kernel(initramfs)—>rootfs  /sbin/init大概就是这么几个过程了,接下来来介绍系统的安装,安装系统虽然看起来简单,普…

    系统运维 2016-09-19