[读书笔记]鸟哥的LINUX私房菜 十二章 正则表达式
第十二章 正则表达式
grep进阶用法
export | grep -A3 -B2 'TERM' 把目标的前2行 后3行也显示出来 before after
在~/.bashrc中加入alias grep='grep --color=auto' ,并source ~/.bashrc 即可每次都别名生效
grep -vn 'the' regular_express.txt 打印不包含the的行 -v 反向搜索
grep -n 't[ae]st' regular_express.txt 查找 test 或 taste
grep -n '[^g]oo' regular_express.txt 搜oo但oo前不能有g ^表示反向选择
grep -n '[^a-z]oo' regular_express.txt 搜oo但oo前不能有小写字母 也可 grep -n [^[:lower:]]oo regular_express.txt [:lower:]代表小写字母集合
grep -n '^the' regular_express.txt ^为行首标志 搜索行首为the的行
grep -n '^[^a-zA-Z]' regular_express.txt 搜索开头不是英文字母的行
grep -n '\.$' regular_express.txt 搜索以.结尾的行 $放右面 . 是特殊符号所以前面要加 \反斜杠
grep -n '^$' regular_express.txt 搜索空行 但grep -n '^\ $' regular_express.txt 却不可以 因为空行不等于空格!!
grep -v '^$' syslog.conf 搜索非空行 -v表示反向显示 但^'^$' 不能显示非空行 因为行首行末没有非!
grep -v '^$' sy* | grep '^[^#]' 表示先显示非空行 再筛选开头非#
注意 正则表达式中 .表示任一字符 *表示重复字符 而!! 通配符中 ?表示任意字符 *表示0或多个字符 !!!
grep -n 'o*' regular_express.txt 表示搜索包含0个或多个‘o’因此没有意义的! grep -n 'oo*' regular_express.txt 这样才确保有1个‘o’或以上
grep 'goo*g' regular_express.txt 搜索“词”首尾都是g,中间有一个或以上的o的单词 而$^是代表“句首尾” 这里不适用,不要混淆
grep -n 'o\{2\}' regular_express.txt 搜索含有2个'o' 的行。 {}表示连续个数。由于{}在shell中具有意义,因此用\反斜杠。
grep -n 'go\{2,5\}g' regular_express.txt 搜两个g之间有2个到5个o
grep -n 'go\{2,\}g' regular_express.txt 搜索两个或以上的o
sed sed 's/旧内容/替换内容/g' s是替换的意思,sed一般都用s,g是全局替换的意思,不加g只会替换每行第一个单词,加了g全部都替换
cat -n regular_express.txt | sed '2,5d' 删除2到5行
cat -n regular_express.txt | sed '2,$d' 删除2到最后行 $代表最后一行 d代表删除
cat -n regular_express.txt | sed '2a drink tea ga' 在第二行后添加内容 a代表插入新增 2i就是在第二行前插入(与vi同理)
cat -n regular_express.txt | sed '2a drink tea ga\
> dringk bear\
> dring fuk' 需要添加多行时 在换行处用\反斜杠
cat -n regular_express.txt | sed '2,5c NO FUCK' c代表取代 覆盖cover 取代2到5行的内容
cat -n regular_express.txt | sed -n '2,5p' -n与p一般配合使用 -n代表使用安静模式去除过多输出 p代表print 打印显示的意思
如果需要提取第一栏的IP地址 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
第一步cat ipadress | sed 's/^.*inet addr://g' 删除inet addr之前的内容
第二步cat ipadress | sed 's/^.*inet addr://g' | sed 's/ Bcast.*//g' 将bcast之后的内容删除
取代或删除 sed 's/被取代内容/新内容/g'
第一步cat -n man1.conf | grep 'MAN' | sed 's/#.*$//g' 将#开头的批注变成空白行 $代表行尾
第二步cat -n man1.conf | grep 'MAN' | sed 's/#.*$//g' | sed '/^[^:print:]*$/d' 第一步的处理不知为何空行中含有不可打印字符。因此用^[^:print:]找出非可打印字符 / 删除内容/
sed -i 's/\.$/!/g' regular_express.txt 将文件每一行最后的句号替换为感叹号。 -i代表直接修改文件,应慎重使用!!
sed -i '$a # this is a test' regular_express.txt 在文件最后一行添加。
printf 格式输出指令
printf '%s\t%s\t%s\t%s\t%s\t\n' $(cat print.txt) | cat > goodlookprint 每一行的每个字段按格式输出 \t表示制表符 \n表示换行 %取代print.txt中每个字段的内容
awk 字段处理指令
cat last | awk '{print $1 "\t" $3}' 默认每个字段以空格或者TAB分割, $1代表第一字段 打印内容要用“”双引号 整个格式要用''加{}引起
cat last -n | awk '{print $1 "\t lines:" NR}' 显示第一栏 并打印awk的内建变量NR:当前处理行 NF:每行字段数
cat passwd | awk 'BEGIN{FS=":"} $4 > 30 {print $1"\t"$3}' 使用BEGIN加FS预设分隔符,中间是判断条件, 最后是格式打印
cat pay.txt
Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000
cat pay.txt | awk 'NR==1{printf"%s\t%s\t%s\t%s\t%s\t\n",$1,$2,$3,$4,"Total"}\ 当第一行时,格式打印第一栏的条目,并添加Total
NR>=2{total=$2+$3+$4 ;printf"%s\t%d\t%d\t%d\t%.2f\n",$1,$2,$3,$4,total}' 当行数>=2时,先定义一个total变量,语句间要;号,
diff文本比对指令(以行为单位)
diff passwd passwd2 对比两个文件
cmp文本对比指令(以字节为单位)
patch文档升级指令 用diff制作补丁档,然后用patch把旧版本的文档升级为新版本的文档 P440
一般正则表达式内容(不限于shell): /正则表达式/ 使用两个斜杠来包围正则表达式
'(word1\|word2\|word3)' 搜索三个单词,注意或符号|需要先转义
\d数字 \w数字字符 \s一个空白或制表符
^开头 $结尾 .除换行符以外的任意字符
后续限制符:{最少重复次数,最大次数},+至少一次; ? 一次或0次; *任意次包含0 如:(\d{4})?出现4个数字或不出现