linux - Three Swordsmen

1.grep:文本过滤工具,从文本文件或管道数据流中筛选匹配的行及数据,可以与正则表达式一起使用

-v:显示不匹配的行,或者说排除某些行,显示不包含匹配文本的所有行
-n:显示匹配行或行号
-i:不区分大小写(只适用于单字符),默认是区分大小写
-c:只统计匹配的行数,注意不是匹配的次数
-E:使用扩展的egrep命令
-e:实现多个选项的匹配,逻辑or关系
--color=auto:为grep过滤的匹配字符串添加颜色
-w:只匹配过滤的单词(包含数字、字母、下划线)
-o:只输出匹配的内容
-P:使用兼容perl的正则引擎
-R:如果文件参数是目录,将递归搜索该目录下的所有子目录和文件(相比于-r,更关注与软连接)
-l:只显示包含匹配模板的行的文件名清单
-A<显示行数>:或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容
-B<显示行数>:或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-C<显示行数>:或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
例子:
    grep -v "oldboy" test.txt:过滤不包含oldboy字符串的行,显示出来
    grep -n "oldboy" test.txt:输出包含oldboy字符串的行,并显示行号
    grep "hello" -RI ./ --exclude-dir=".svn" : 在当前目录和子目录中的所有文件匹配hello,忽略.svn目录
    grep -o '&port=.*' t.txt:获取port字符串后的数据(包括port)
    grep -o '.*&port=' t.txt:获取port字符串之前的数据(包括port)
    grep -v "^$\|#" test.txt:排除注释行或空行
    grep -w nihao test.txt:匹配有nihao这个完成字符串的行,如果是nihao1这种类似的字符串是不会匹配的,但=nihao=会被匹配

2.sed(stream editor):字符流编辑器,操作、过滤和转换内容的强大工具,常用功能对文件实现快速增删改查,其中查询的功能中最常用的是过滤和取行

-n:取消默认的sed的输出,常与sed内置命令的p连用
-i:直接修改文件内容,而不是输出到终端。如果不使用-i选项,则sed只是修改内存中的数据,并不会影响磁盘上的文件
-e:直接在命令行模式上进行sed动作编辑
-f:将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r:支持扩展表达式
内置命令字符(编辑命令):
p:打印匹配行(和-n选项一起合用)
=:显示文件行号
a\:在定位行号后附加新文本信息
i\:在定位行号后插入新文本信息
d:删除定位行
c\:用新文本替换定位文本
w filename:写文本到一个文件,类似输出重定向 >
r filename:从另一个文件中读文本,类似输入重定向 <
s:使用替换模式替换相应模式
q:第一个模式匹配完成后退出或立即退出
l:显示与八进制ACSII代码等价的控制符
{}:在定位行执行的命令组,用分号隔开
n:从一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理
N:不会清空模式空间的内容,并从输入文件中读取下一行数据,追加到模式空间中,两行数据以换行符\n连接
g:将模式2粘贴到/pattern n/
y:传送字符,替换单个字符
&:代表前面匹配的字符
s/regexp/replacement:匹配regexp部分的内容,用replacement替换regexp匹配的内容,regexp部分可以使用正则表达式,在replacement部分可以使用特殊字符&和\1-\9等匹配regexp部分的部分内容,在实际中,s/regexp/replacement/g,结尾用g做全局匹配
使用行号:
x:x为行号
x,y:表示从x行到y行
/pattern:查询包含模式的行
/pattern /pattern:查询包含两个模式的行
pattern/,x:在给定行号上查询包含模式的行
x,/pattern/:通过行号和模式匹配行
x,y!:查询不包含制定行号x和y的行
例子1:
    sed -n '/second/p' test.txt:打印匹配到second字符的行
    sed -n '/second/, 4p' test.txt:打印匹配到second字符的行到第四行之间的行
    sed -n '2,/second/p' test.txt:打印匹配第二行到第一次匹配second行之间的行
    sed -n '2,4{=;p}' test.txt:打印第二行到第四行之间的内容并且打印行号,用不同编辑命令式,用{}分号隔开
    sed '2a 106,dandan,CSO' test.txt:在test文件的第二行后追加一行内容“106,dandan,CSO”
    sed '2i 106,dandan,CSO' test.txt:在test文件的第二行前插入一行内容“106,dandan,CSO”
    sed '2a 106,dandan,CSO\n103,daadaa,XSO' test.txt:在test文件的第二行后追加两行内容“106,dandan,CSO”和“103,daadaa,XSO”
    sed '2d' test.txt:将test文件中的第二行删除
    sed '/abc/d' test.txt:将test文件中含有abd的行删除
    sed '2,5d' test.txt:将test文件中的第二行到第五行之间的内容删除,包括第二行和第五行
    sed '2p' test.txt:将test文件中的第二行打印出来
    sed "s#zhangyao#dandan#g" test.txt:将test文件中的zhangyao替换成dandan(是全局替换)
    sed -r -i '/\[REDIS.*_[1-9][0-9]?\]/,+4d ' test.txt 将匹配的行和后面的4行全部删除
正则表达式、扩展正则表达式,必须结合-r选项:
^:锚点行首的符合条件的内容,用法格式"^pattern"
$:锚点行首的符合条件的内容,用法格式"pattern$"
^$:空白行
.:匹配任意单个字符
*:匹配紧挨在前面的字符任意次(0,1,多次)
.*:匹配任意长度的任意字符
\?:匹配紧挨在前面的字符0次或1次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{m,\}:匹配其前面的字符至少m次
\{m\}:精确匹配前面的m次\{0,n\}:0到n次
\<:锚点词首----相当于 \b,用法格式:\<pattern
\>:锚点词尾,用法格式:\>pattern
\<pattern\>:单词锚点
分组,用法格式:pattern,引用\1,\2
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]:所有数字, 相当于0-9, [0-9]---> [[:digit:]]
[:lower:]:所有的小写字母
[:upper:]:所有的大写字母
[:alpha:]:所有的字母
[:alnum:]:相当于0-9a-zA-Z
[:space:]:空白字符
[:punct:]:所有标点符号
例子2:
http://ip:port/dd.php?a=888&b=1&c=111&dd=ttt&e=sdf
sed 's/.*dd=\([[:alnum:]]*\).*/\1/' test.txt:匹配dd=ttt这个key的等号后面的字符串
sed 't;s/&/\n/2;D' t.txt:每行第二个&符之前的全部删除
sed -r 's#\b(cuid=\w+)\w\B#\12#g' -i test.txt

3.awk:即是命令也是一种编程语言

-F:指定字段分隔符
-v:定义或修改一个awk内部的变量
内置命令:
NR:表示行号
print:打印
$0:代表整个一行的内容
$n(n=1,2,3,4...):第几列
$NF:最后一列
例子:
    awk 'NR==5' test.txt:打印test文件的第五行
    awk 'NR==2, NR==6' test.txt:打印test文件的第2-6行
    awk '{print NR,$0}' test.txt:打印test文件的内容,并给每行加上行号
    awk 'NR==2, NR==6 {print NR,$0}' test.txt:打印test文件的第2-6行,并给每行加上行号
    awk -F ":" '{print $1,$3,$NF}' test.txt:用冒号作为分隔符,打印test文件的第一列,第三列,最后一列
    awk -F "[ :]+" 'NR==2 {print $4}' test.txt:用空格或冒号作为分隔符,打印test文件的第二行,第四列
    awk ' / *\$[1-9][0-9]*\.[0-9][0-9]* */ { print $1, $2, $3, "*"; } ' test.txt:打印test.txt文件中金额大于1的行并在结尾打印*
比较操作符、混合表达式:
<、>、<=、>=、==、!=:小于、大于、小于等于、大于等于、等于、不等于
value ~/pattren/:如果value匹配样式,则为真
value !~/pattren/:如果value不匹配样式,则为真
&&、||:与、或
例子:
    awk ' $3 <=75 { printf "%s\t%s\n", $0, "REO" ;}' test.txt:打印test.txt文件中第三列大于等于75的行
    awk ' $2 ~/^\$[1-9][0-9]*\.[0-9][0-9]*/ {print $0}' test.txt:打印test.txt文件中第二列小数为大于1的行
    awk ' ($2 ~/^\$[1-9][0-9]*\.[0-9][0-9]*/) && ($3 < 75) {print $0}' test.txt:打印test.txt文件中第二列小数为大于1且第三列小于75的行
        next:跳过所有保留的样式匹配和表达式,直接读取下一行
    awk ' $3 <=75 { printf "%s\t%s\n", $0, "REO" ; next}
    $3 >75 {print $0}' test.txt:当test.txt文件中的某一行的第三列小于等于75,打印第三行后,直接读取下一行,否者执行第二个匹配
变量:
awk ' { value=$1; print value } ' test.txt:读取test.txt每一行,并将每行第一列赋值给value,打印出来
数值操作符:+、-、*、/、%(取模(余))、^(求幂)
awk ' /^ *$/{ x=x+1; print x; } ' test.txt:没读取test.txt,记一次数,并打印出来
复制操作符:+=、-=、*=、/=、%=、^=
awk ' /^ *$/{ x+=1; print x; } ' test.txt:没读取test.txt,记一次数,并打印出来
特殊样式匹配:BEGIN(读取文件开始时,执行BEGIN后的语句)和END(awk执行结束前,执行END后的语句)
awk ' BEGIN {print "11111111"} /[0-9]/ {print $0; next} END {print "hello world"}' test.txt:执行开始时,打印1111111,然后读取test.txt匹配数字并打印出来,读取每一行,数据全部读完后,打印hello world
内部变量:
FILENAME:当前输入文件的名称,不能改变这个变量的值
NR:当前输入文件的行数或者输入文件的记录,不能改变这个变量的值
NF:当前行或者记录的字段数,不能改变这个变量的数值
OFS:输出字段的分隔符(默认是空格)
FS:输入字段的分隔符(默认是空格和制表符)
OFMT:数字的输出格式(默认是%.6g)
ORS:输出记录分隔符(默认是新起一行)
RS:输入记录分隔符(默认是新起一行)
awk使用shell变量:
    #!/bin/sh
    numfruit="$1"
    if [ -z "$numfruit" ]; then numfruit=75; fi
    awk ' $3 <= numfruit {print ;}' numfruit="$numfruit" test.txt
awk判断语句:
if (expr1) {action1}
else if (expr2) {action2}
else {action3}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值