一.grep过滤
grep --help:
匹配模式选择:
Regexp selection and interpretation:
-E, --extended-regexp 扩展正则
-F, --fixed-strings PATTERN is a set of newline-separated fixed strings
-G, --basic-regexp 基本正则
-P, --perl-regexp 调用perl的正则
-e, --regexp=PATTERN use PATTERN for matching
-f, --file=FILE obtain PATTERN from FILE
-i, --ignore-case 忽略大小写
-w, --word-regexp 匹配整个单词
-x, --line-regexp 匹配正行
-z, --null-data a data line ends in 0 byte, not newline
条件判断相关参数
- 与文件存在与否的判断
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 是否为普通文件
-d 是否为目录
-S socket -p pipe -c character -b block -L 软link
-s 是否为空白文件 说明:-s表示非空,! -s 表示空文件
- 文件权限相关的判断
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid -g 是否sgid
-k 是否有t位
- 两个文件的比较判断
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
- 整数之间的判断
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
- 字符串之间的判断
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 = string2 是否相等
string1 != string2 不等 ! 结果取反
- 多重条件判断
逻辑判断符号:
-a 和 && (and 逻辑与)
-o 和 ||(or 逻辑或) ! 逻辑非
总结:
1、; && ||都可以用来分割命令
2、; 完全不考虑前面的语句是否正确执行,都会执行;号后面的内容
3、&& 需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
4、|| 需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后的内容;反之亦然
5、如果&&和||一起出现,从左往右依次看,按照以上原则,此时么有优先级
6、优先级是在多重条件判断中,如[ 1 -eq 1 -o 1 -ne 1 -a 2 -eq 3 ]
二、sed 介绍
1. sed的工作流程
- 首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。
- sed每处理完一行就将其从临时缓冲区删除,然后读取下一行,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。
- sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
- Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
2. sed两种使用方法
sed常见的语法格式有两种,一种叫命令行模式,另一种叫脚本模式。
2.1 命令行格式
- 格式
sed -option 'commands[地址定位]' filename
说明:引用shell script中的变量应使用双引号,而非通常使用的单引号
option:
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出 -f 指定sed脚本的文件名
-r 使用扩展正则表达式
-i 重定向输出<修改源文件>
- 常用命令
p 打印行
d 删除行
i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
sed '5aitcast.cc hello' 1.txt
sed 'a8888888' 1.txt
sed 'i8888888' 1.txt
sed '$i8888888' 1.txt //最后一行的前面插入
sed '$a8888888' 1.txt ////最后一行的后面插入
# sed '7chello\nworld' 1.txt //替换第7行的所有内容
r 从文件中读取输入行
w 将所选的行写入文件
sed '10r/etc/hosts' 1.txt
sed '$r/etc/hosts' 1.txt
sed '1,5w 2.txt' 1.txt
cat 2.txt
sed '1,5w /tmp/1.txt' 1.txt
cat /tmp/1.txt
! 对所选行以外的所有行应用命令,放到行数之后 #
sed -n '1!p' 1.txt
s 用一个字符串替换另一个
g 在行内进行全局替换
[root@server shell04]# sed -n 's/root/ROOT/p' 1.txt ROOT:x:0:0:root:/root:/bin/bash
[root@server shell04]# sed -n 's/root/ROOT/gp' 1.txt ROOT:x:0:0:ROOT:/ROOT:/bin/bash
y 将字符替换为另一字符(不能对正则表达式使用y命令)
& 保存查找串以便在替换串中引用
= 打印行号
- 定址
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
x 指定x行号
x,y 指定x到y行号
/key/ 查询包含关键字的行
/key1/,/key2/ 匹配包含两个关键字之间的行
/key/,x 从匹配关键字的行开始到文件第x行之间的行(包含关键字所在行)
x,/key/ 从第x行开始到与关键字的匹配行之间的行
x,y! 不包含x到y行
y命令 该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。
正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。
# sed '39,41y/stu/STU/' /etc/passwd
# sed '39,41y/stu:x/STU@%/' /etc/passwd
-e 选项 多项编辑
-e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。
-i 选项 直接修改原文件
# sed -i 's/root/ROOT/;s/stu/STU/' 11.txt
& 符号 保留查找字符串
# sed -n 's/^root/#&/p' passwd
注释掉以root开头的行
# sed -n -r 's/^root|^stu/#&/p' /etc/passwd
注释掉以root开头或者以stu开头的行
# sed -n '1,5s/^[a-z].*/#&/p' passwd
注释掉1~5行中以任意小写字母开头的行
# sed -n '1,5s/^/#/p' /etc/passwd
注释1~5行 或者
sed -n '1,5s/^/#/p' passwd
以空开头的加上
# sed -n '1,5s/^#//p' passwd
以#开头的替换成空 vim ——>ctrl+v——>I(行头插入)——>ESC
sed -n '/^root/p' 1.txt
sed -n 's/^root/#&/p' 1.txt
sed -n 's/\(^root\)/#\1/p' 1.txt
sed -nr '/^root|^stu/p' 1.txt
sed -nr 's/^root|^stu/#&/p' 1.txt
= 打印行号
# sed -n '/bash$/=' passwd 打印以bash结尾的行的行号
# sed -ne '/root/=' -ne '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
# sed -n '/nologin$/=;/nologin$/p' 1.txt
# sed -ne '/nologin$/=' -ne '/nologin$/p' 1.txt
2.2脚本格式
- 用法
# sed -f scripts.sed file //使用脚本处理文件 建议使用 ./sed.sh
脚本的第一行写上 #!/bin/sed -f
1) 脚本文件是一个sed的命令行清单。
2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。
3) 如果在一行中有多个命令,应该用分号分隔。
4) 不需要且不可用引号保护命令
5) #号开头的行为注释
2.3 sed和正则的综合运用
1、正则表达式必须以”/“前后规范间隔
例如:
sed '/root/d' file
例如:sed '/^root/d' file
2、如果匹配的是扩展正则表达式,需要使用-r选来扩展sed
注意:
在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 "\" 号做转义
eg:sed '/\$foo/p' file
3、逗号分隔符 例如:sed '5,7d' file 删除5到7行
例如:sed '/root/,/ftp/d' file 删除第一个匹配字符串"root"到第一个匹配字符串"ftp"的所有行本行不找 循环执行
4、组合方式 例如:sed '1,/foo/d' file 删除第一行到第一个匹配字符串"foo"的所有行
例如:sed '/foo/,+4d' file 删除从匹配字符串”foo“开始到其后四行为止的行
例如:sed '/foo/,~3d' file 删除从匹配字符串”foo“开始删除到3的倍数行(文件中)
例如:sed '1~5d' file 从第一行开始删每五行删除一行
例如:sed -n '/foo|bar/p' file 显示配置字符串"foo"或"bar"的行
例如:sed -n '/foo/,/bar/p' file 显示匹配从foo到bar的行
例如:sed '1~2d' file 删除奇数行
例如:sed '0-2d' file 删除偶数行 sed '1~2!d' file 5、特殊情况
例如:sed '$d' file 删除最后一行
例如:sed '1d' file 删除第一行
6、其他: sed 's/.//' a.txt 删除每一行中的第一个字符
sed 's/.//2' a.txt 删除每一行中的第二个字符
sed 's/.//N' a.txt 从文件中第N行开始,删除每行中第N个字符(N>2)
sed 's/.$//' a.txt 删除每一行中的最后一个字符
三、awk
- awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。
- awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
- awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
- gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
- 下面介绍的awk是以GNU的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。
1. awk两种使用方法
- 命令模式
awk [options] 'commands' file(s)
option 部分
-F 定义字段分割符号
-v 定义变量并赋值 command 部分:
1、范围说明或者正则表达式或者{awk命令语句1;awk命令语句2;}
2、范围说明部分可以是BEGIN、END、逻辑表达式或者为空
3、awk命令语句间用分号间隔
4、引用shell变量需用双引号引起
- 脚本模式
awk [options] -f scriptfile file(s) 特点:
1、awk脚本是awk命令的清单
2、命令需要用分号间隔
3、#号开头的是注释行
4、#!/bin/awk -f
2. awk基本应用(commands)
- 字段分割及相关变量
$1,$2,$3...$n:awk中用该顺序形式表示files中每行以间隔符号分割的各列的不同字段
$0表示文本本身 注: awk默认以空格符为间隔符号将每行分割为单独的字段,也可以使用awk内置变量FS定义间隔符号
NF 表示当前记录的字段数(列数)
$NF 最后一列
$(NF-1) 倒数第二列
FNR/NR 行号
FILENAME 文件名
"\t" 制表符
"\n" 换行符
RS 换行符
"" 打印字符串
FS 定义间隔符
print 打印函数
- 定义变量
# awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd 注意: awk中调用变量不需要加$
定址
关键字:
BEGIN:表示在程序开始前执行
END :表示所有文件处理完后执行
BEGIN和END之间";"分号隔开
示例:
1. 打印最后一列和倒数第二列(登录shell和家目录)
# awk 'BEGIN {FS=":"} {print $NF, $(NF-1)}' /etc/passwd|head -5
# awk 'BEGIN{FS=":"};{print $NF"@@@@"$(NF-1)}' 1.txt
3. awk和正则的综合运用
- 逻辑运算符
== (等于)
!= (不等于)
> (大于)
< (小于)
>= (大于等于)
<= (小于等于)
~ (匹配于)
!~ (不匹配于)
! (非)
&& (与)
|| (或)
- 示例
# awk '/root/{print $1}' passwd 使用普通字符定位
# awk '$0 ~ /^root/ {print $1}' passwd 使用正则表达式定位
注意:正则需要用"/xx/"包住
从第一行开始匹配到以lp开头行
awk -F: 'NR==1,/^lp/{print $0 }' passwd
从第一行到第5行
awk -F: 'NR==1,NR==5{print $0 }' passwd
从以lp开头的行匹配到第10行
awk -F: '/^lp/,NR==10 {print $0 }' passwd
从以root开头的行匹配到以lp开头的行
awk -F: '/^root/,/^lp/{print $0}' passwd
打印以root开头或者以lp开头的行
awk -F: '/^root/ || /^lp/{print $0}' passwd awk -F: '/^root/;/^lp/{print $0}' passwd
显示5-10行
awk -F':' 'NR>=5 && NR<=10 {print $0}' /etc/passwd
awk -F: 'NR<10 && NR>5 {print $0}' passwd
打印IP地址
# ifconfig eth0|awk 'NR>1 {print $2}'|awk -F':' 'NR<2 {print $2}'
# ifconfig eth0|grep Bcast|awk -F':' '{print $2}'|awk '{print $1}'
# ifconfig eth0|grep Bcast|awk '{print $2}'|awk -F: '{print $2}'
# ifconfig eth0|awk NR==2|awk -F '[ :]+' '{print $4RS$6RS$8}'
# ifconfig eth0|awk "-F[ :]+" '/inet addr:/{print $4}'
screen 小工具
screen ctrl a+d 把前台进车个放入后台运行
screen -ls 查询 被放入后台的进程
screen -dmS 进程名 命令 直接 进入后台运行