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
下一篇 2017-08-24

相关推荐

  • Linux发展史

    Linux发展史 摘要:因为学习linux过程中对整个linux发展历史只有一些模糊的理解,以本文来对linux发展史进行梳理来加深学习。   一、linux是什么 linux就是一套操作系统,如下图操作系统就是内核与系统调用接口那 Linux只是一套操作系统并不包含其他应用程序。 Linux提供了一个完整的操作系统当中最底层的硬件控制和资源管理的…

    Linux干货 2016-10-14
  • N22-第十四周作业

    系统的INPUT和OUTPUT默认策略为DROP; ~]# iptables -P INPUT DROP ~]# iptables -P OUTPUT DROP 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的…

    Linux干货 2017-03-15
  • 学习宣言

    我是喻成,我参加了马帮第22期的linux运维网络班,于2016年8月开始跟随马哥学习linux, 我的学习宣言是:要享受学习的每一刻,我思故我在。

    Linux干货 2016-08-15
  • HDFS写入和读取流程

    一、HDFS HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB,GB以及TB,并写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改,则并不是十分适合。 目前HDFS支持的使用接口除了Java的还有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS…

    Linux干货 2015-05-12
  • 20160803作业-用户组和权限管理

    http://note.youdao.com/yws/public/redirect/share?id=46f06331b737c6d08a0e8c9c3d49ac9e&type=false

    Linux干货 2016-08-08
  • 第一周作业

    1. 描述计算机的组成及其功能。
    2. 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    3. 描述Linux的哲学思想,按照自己的理解对其解释性描述。
    4. 说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、……等命令使用,配合相应实例阐述。
    5. 如何获取帮助信息,描述man文档章节划分。
    6. 罗列发行版基础目录名称命名法则及功用规定。

    Linux干货 2017-12-03