2、系统的错误讯息登录档案记录了系统所有信息,包括被【入侵】的纪录数据;
3、两个邮件服务器软件sendmail与postfix,支持正规表示法;
4、基础正规表示法和延伸正规表示法;
5、先定义好环境语系,因为它与正规表示法有可能产生冲突;本章练习以LANG=C为主。
grep [-A][-B][--color=auto] '搜寻字符串' filename
A加数字,列出当前行与后续n行/B同上,但列出当前与n行前/攫取的数据列出颜色
例:dmesg | grep 'eth' dmesg 列出核心产生的信息!!!eth网络卡信息
dmesg | grep -n --color=auto 'eth' 增加显示行数
dmesg | grep -A3 -B2 -n --color=auto 'eth' 追加前2后3一起列出
grep分析:最重要功能是进行字符串数据对比,整行攫取;
alias grep='grep --color=auto' 别名的设定
source ~/.bashrc 在个人配置文件内将自定义变量变成环境变量
(这样以后输入grep可自动加上颜色显示)
练习先决条件:【export LANG=C】;
grep已设定成【grep --color=auto】;
例1:搜寻特定字符串:
grep -n 'the' Shawn.txt
上题反向:
grep -vn 'the' Shawn.txt
不论大小写:
grep -in 'the' Shawn.txt
例2:利用中括号[]来搜寻集合字符:
grep -n 't[ae]st' Shawn.txt 共通的t?st存在即可
grep -n '[^g]oo' Shawn.txt 注意^在中括号里面
grep -n '[^a-z]oo' Shawn.txt
grep -n '[^[:lower:]]oo' Shawn.txt
grep -n '[[:digit:]]' Shawn.txt
例3、行首与行尾字符 ^ $:
grep -n '^the' Shawn.txt 只有行首为the的才攫取
grep -n '^[a-z]' Shawn.txt 攫取开头为小写字母的
grep -n '^[[:lower:]]' Shawn.txt 与上同
grep -n '\.$' Shawn.txt 行尾结束为小数点,需跳脱字符。注意windows的断行符为^M,所以无法被攫取
grep -n '^$' Shawn.txt 空白行
grep -v '^$' /etc/syslog.conf | grep -v '^#' 不要空白行和不要开头#的那行
例4、任意一个字符.与重复字符*:
grep -n 'g..d' Shawn.txt
grep -n 'ooo*' Shawn.txt 至少两个o,第三个可有可无
grep -n 'goo*d' Shawn.txt
grep -n 'g*g' Shawn.txt 找出g开头、g结尾的行
例5、限定连续RE字符范围{}:
grep -n 'o\{2\}' Shawn.txt 找两个o的字符
grep -n 'go\{2,5\}g' Shawn.txt g后面接2到5个o,再接一个g
grep -n 'go\{2,\}g' Shawn.txt 两个以上的o
ls -l /etc | grep '^|' 找出/etc/底下文件类型为链接文件属性的文件名
7、sed工具:
sed [-nefr] [动作] n安静模式只列处理行/e动作编辑/f动作写入档案/f文件内/r支持延伸正规法/i修改档案
动作说明:[n1][n2] function 其中n1,n2表示动作行数
function包含 a新增/c取代,后接字符串/d删除/i插入/p打印/s取代,直接取代工作。
例:nl /etc/passwd | sed '2,5d'
nl /etc/passwd | sed '2a drink tea' 新增字符串在2行后面
nl /etc/passwd | sed '2i drink tea' 在第2行前面
nl /etc/passwd | sed '2a drink tea ...... \ drink beer' 增加2行,需用\分开
nl /etc/passwd | sed '2,5c NO 2-5 number' 字符串将2-5行取代
nl /etc/passwd | sed -n '5,7p' 抓出5-7行的数据查阅,用n是防止重复输出
部分数据搜寻并取代:
sed's/要被取代的字符串/新字符串/g'
ifconfig | grep 'inet '| sed 's/^.*inet://g' 删除IP前面部分不成功?
例:grep攫取MAN
cat /etc/man.config | grep 'MAN'
删除批注后数据:
cat /etc/man.config | grep 'MAN'| sed 's#.*$//g'
删掉空白行
cat /etc/man.config | grep 'MAN'| sed 's#.*$//g' | sed '/^$/d'
sed直接修改档案内容:危险动作!!!
例:sed -i 's/\.$/\!/g' Shawn.txt 取代!是什么意思?
档案最后一行加入字符串:
sed -i '$a # This is Shawn's test' Shawn.txt
8、延伸正规表示法:
基础法:
grep -v '^$' Shawn.txt | grep -v '^#' 去除空白行与行首为#
延伸法:
egrep -v '^$|^#' Shawn.txt 功能同上(透过群组功能|一次性搜寻,开头可用grep -E或egrep)
egrep -n 'go+d' Shawn.txt 1个或以上o
egrep -n 'go?’ Shawn.txt 0或1个,若与上面组合相当于'go*d'
egrep -n 'g(la|oo)d' Shawn.txt 找群组字符串
echo 'AxyxyxyxyZ' | grep -n 'A(xy)+Z' Shawn.txt
grep -n '[!>]' Shawn.txt 查出档案含有!与>的行
注意,【!】非特殊字符
9、文件的格式化与相关处理:
格式化打印:printf '打印格式' 实际内容
特殊样式:a/b/f/n/r/t/v/xNN
a警告出声/b退格/f清屏/n输出新一行/r[Enter]/t水平[tab]/v垂直[tab]/xNN 转换数字为字符
C语言的变数格式:%ns/%ni/%N.nf s是string/i是整数/f是floating
例:vim printf.txt
printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
printf '%10s\t %5i\t %5i\t %5i\t %8.2f \n' $(cat printf.txt | grep -v Name)
printf '\x45\n' 将16位进制的45转化为字符,结果应为E
10、awk:好用的数据处理工具,以一行当中分成数个【字段】进行处理
awk '条件类型1{动作1} 条件类型2{动作2} ... ' filename (字段的分隔符为空格或tab键)
last -n 5 将登录者前5行数据取出
last -n 5 | awk '{print $1 "\t" $3}' 打印
NF——字段总数;
NR——当前第几行
FS——空格
注意:相当于读入第一行,将资料填入$0,$1,$2...等变数当中,$0拥有字段总数。$1每一行账号
last -n 5 | awk '{print $1 "\t lines:" NR "\t columes:" NF}'
11、awk的逻辑运算符
cat /etc/passwd | \
>awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' 显示1和3小于10的字段
cat /etc/passwd | \
>awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}' 可从第一行开始列出
cat Shawn.txt | \
>awk 'NR==1{printf
"%10s "%10s "%10s "%10s "%10s\n",$1,$2,$3,$4,"Total"}
NR>=2{total=$2+$3+$4
printf"%10d "%10d "%10d "%10d %10.2f\n",$1,$2,$3,$4,total}'
12、档案对比工具:diff(ASCII纯文本)、cmp(比对非纯文本档)
diff [-bBi] from-file to-file b忽略一行中有空白的差异/B忽略空白行差异/i忽略大小写
例1:mkdir -p /tmp/test
cd /tmp/test
cp /etc/passwd passwd.old
cat /etc/passwd | \
> sed -e '4d' -e '6c no six line' > passwd.new
例2:diff passwd.old passwd.new 对比档案
diff /etc/rc3.d/ /etc/rc5.d/ 对比目录
cmp 【字节】的对比 可比较二进制binary
cmp [-s] file1 file2 列出所有不同的字节处
cmp passwd.old passwd.new
patch 升级补丁档
patch -pN < patch_file 更新 p接[取消几层目录]
patch -R -pN < patch_file 还原 R代表还原,新变旧
例1:diff -Naur passwd.old passwd.new > passwd.patch
cat passwd.patch
例2:patch -p0 < passwd.patch 同一目录则用0
patch -R -p0 < passwd.patch
13、档案打印准备:pr
pr /etc/man.config
14、练习:
find / -type f | xargs -n 10 grep -l '\*' xargs可读入标准输入的资料
建立新指令与新变量:
alias myip="ifconfig eth0 | grep 'inet addr' | \
>sed 's/^.*inet addr://g'| cut -d '' -f1 "
MYIP=$(myip)
参考数据不延伸阅读
注1:关亍正规表示法不 POSIX 及特殊语法的参考网址可以查询底下的来源: 维基百科的说明:
http://en.wikipedia.org/wiki/Regular_expression ZYTRAX 网站介绍:
http://zytrax.com/tech/web/regex.htm
注2:其他关亍正规表示法的网站介绍: 洪朝贵老师的网页:
http://www.cyut.edu.tw/~ckhung/b/re/index.php 龙门少尉的窝:
http://main.rtfiber.com.tw/~changyj/ PCRE 官方网站:
http://perldoc.perl.org/perlre.html
注3:关亍 ASCII 编码对照表可参考维基百科的介绍: 维基百科 (ASCII) 条目:
http://zh.wikipedia.org/w/index.php?title=ASCII&variant=zh-tw
注4:关亍 awk的进阶文献,包括有底下几个连结: 中研院计算中心 ASPAC 计划之 awk 程序介绍:
http://phi.sinica.edu.tw/aspac/reports/94/94011/ 鸟哥备份:
http://linux.vbird.org/linux_basic/0330regularex/awk.pdf 这份文件写的非常棒!欢迎大家多多参考!
Study Area:http://www.study-area.org/linux/system/linux_shell.htm