Linux文本处理——sed、awk命令引入:有一个例子:在服务器日志fresh.log中,找到所有报错的日期。
$ sed -n `/Error/p` fresh.log | awk `{print $1}`Linux 三大利器:grep:查找一行指令,轻松搞定sed:行编辑器awk:文本处理工具正则表达式》》》sed基本处理》》》awk更为复杂的处理1.正则表达式场景:查找——查找所有包含‘Linux’的行取出——取出以‘abc’开头的所有单词匹配——匹配两位数、密码、qq号、身份证号等正则表达式学习的方法:1.单个字符表示2.字符串表示3.表达式示例:以cat /etc/passwd文档为例。
首先将这个文档拷贝到~/. 下cp /etc/passwd ~/.grep查找文件内容:grep+查找内容+文件/文档grep ‘mooc’ passwd正则表达式单字符字符:1.特定字符2. 范围内字符3.任意字符1.特定字符:某个具体的字符‘1’ ‘a’grep ‘1’ passwd2.范围内字符:单个字符[]数字字符:[0-9], [259]grep ‘[0-9]’ passwd小写字符:[a-z]大写字符:[A-Z]大小写字符:[a-zA-Z]数字之外的字符:[a-zA-Z, :_/-().]反向字符:^取反:[^0-9], [^0]3.任意字符:.‘[.]’ 指小数点。
‘\.’ 指本来的意思,小数点。
正则表达式其他符号:边界字符:头尾字符^: ^root头字符注意与[^]的区别。
$ : flase$尾字符空行:‘/^$/’元字符(代表普通字符或特殊字符)\w : 匹配任何字类字符,包括下划线\W :匹配任何非字类字符。
\b : 分隔符,代表单词的分隔。
‘\bx\b’正则表达式字符组合字符串:‘root’‘100’ ‘m..c’‘[A-Z][a-z]’ 大写小写组合‘\b[0-9][0-9]\b’ 两位数组合字符串:重复:*: 零次或多次匹配前面的字符或子表达式se* 表示:sseseeseeesee… 匹配+: 一次或多次匹配前面的字符或子表达式se\+表示:seseeseeesee… 匹配?:零次或一次匹配前面的字符或子表达式se\?表示: s se 匹配对多个字符重复:(se)*grep ‘\(se\)*’ test.txtgrep ‘\(se\)\+’ test.txt重复特定次数:{n,m} n是最小次数,m是最大次数。
grep‘[0-9]\{2,3\}’passwd匹配两位数到三位数(大括号前面一定要加‘\’)任意字符串的表示:.*比如:^r.*(以r开头的任意字符)m.*c(m和c之间的任意字符串)\bm[a-z]*c\b(缩小范围,之间只能是字母) 逻辑的表示:|: 表示“或”。
‘bin/\(false\|true\)’正则表达式例子:匹配4-10位qq号grep ‘^[0-9]\{4,10\}$’qq.txt匹配15位或18位身份证号(支持带x的)grep‘^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$’qq.txt匹配密码(由数字、26个字母和下划线组成)grep ‘^\w\+$’qq.txt使用sed工具:自动处理文件分析日志文件修改配置文件sed处理特点:sed一次处理一行内容sed不改变文件内容(除非重定向)使用sed——格式命令行格式$sed [options] ‘command’ file(s)Options: -e ; -nCommand : 行定位(正则)+sed命令(操作)例如:$ sed -n ‘/root/p’$ sed -e ’10,20d’-e ‘s/false/true/g’脚本格式$ sed -f scriptfile file(s)sed——操作命令基本操作命令(1):-p (打印相关的行,要与参数-n匹配一起使用。
)$ sed -n‘p’passwd定位一行:x;(行号)/pattern/$ nlpasswd | sed-n ‘10p’$ sed -n ‘/mooc/p’passwd定位几行:x,y;(从x到y行) /pattern/,x;x,y!(不选择x到y行) $nlpasswd | sed -n ‘10,20p’$ nlpasswd | sed -n ‘/news/,/mooc/p’定位间隔几行:first~step(表示从first行开始,中间间隔step行数。
)$ nlpasswd | sed -n ‘1~2p’基本操作命令(2):-a(新增行)/i(插入行)-c(替代行)-d(删除行)例子:$ nlpasswd | sed ‘1,5a ==========’(新增行是在行号之后) $ nlpasswd | sed ‘5i ============’(插入行是在行号之前) $ nlpasswd | sed‘35,40c akdlaihlnanahi’(整体替换)$ nlpasswd | sed ‘/mooc/d’案例一:优化服务器配置“在ssh的配置文件假如相应文本:Port52113Permit Root LoginnoPermitEmptyPasswordsno”$ sed ‘$a \ prot52113 \npermitrootloginno’ssh_config案例二:文本处理删除文本中空行$ sed ‘/^$/d’a.txt案例三:服务器日志处理服务器log中出现‘error’信息$ sed-n ‘/Error/p’fresh.log基本操作命令(3):-s (替换) :分隔符/, # 等-g(全局):全部替换$ sed‘s/false/true’passwd$ sed ‘s/:/%/g’passwd案例四:数据筛选(获取ip)$ ifconfig ens33 | sed -n ‘/inet /p’| sed ‘s/inet.*r://’| sed ‘s/B.*$//’高级操作命令(1):{}:多个sed命令,用;分开$ nlpasswd | sed ‘{20,30d;s/flase/ture/g}’高级操作命令(2):-n : 读取下一个输入行(用下一命令处理)$ nlpasswd | sed -n ‘{n;p}’(打印出偶数行)$ nlpasswd | sed -n ‘{p;n}’(打印出奇数行)高级操作命令(3):-&:替换固定字符串$ sed ‘s/^[a-z_-]\+/& /’passwd (用&可以代替^[a-z_-]\+匹配)案例一:大小写转换将用户名的首字母转换为大写或小写(元字符\u\I\U\L:转换为大写或小写字符)$ sed ‘s/^[a-z_-]\+/\u&/’passwd (\u将小写首字母转换为大写首字母)将文件夹下的.txt文件名转换为大写$ ls *.txt$ ls *.txt | sed ‘s/^\w\+/\U&/’(\U全部变成大写字母)案例三:数据筛选获取passwd中USER、UID和GID$ sed‘s/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\).*$/USER:\1UID:\2 GID:\3/’高级操作命令(4):-\( \) : 替换某种(部分)字符串(\1,\2)案例四:数据筛选(获取ip)$ ifconfig ens33 | sed -n ‘/inet /p’| sed ‘s/inet.*r://’| sed ‘s/B.*$//’这是之前的方法,现在用新方法优化一下。
$ifconfig ens33 |sed -n‘/inet/p’| sed ‘s/inet.*r:\([0-9.]\+\). *$/\1’# 用\1代替括号里面的字符串,从而提取出想要的区段。
高级操作命令(5):-r:复制指定文件插入到匹配行(对文件不改写)-w:复制匹配行拷贝指定文件里(对文件改写)源文件互操作目标文件# 创建123.txt文件和abc.txt文件$ echo -e ‘173648891\n174589763\n167354736’>123.txt$ cat 123.txt$ echo -e ‘asklhflkkak\nhhanuhwena\ngfuieqgfjb’>abc.txt$ cat abc.txt$ sed ‘1r 123.txt’abc.txt (表示将123.txt文件读入到abc.txt文件的第一行后面,但是,不会改变文件内容)$ sed ‘1w abc.txt’123.txt(表示将123.txt文件的第一行写入abc.txt 中,改变了abc.txt中的内容)高级操作命令(6):-q:退出sed$ nlpasswd|sed ‘/flase/q’(找到第一个/flase就退出sed)。