Linux三剑客awk命令篇二:命令 *** 作符
关于awk的原理等基本知识请参考上篇:
Linux三剑客awk命令篇一:原理及基本命令
补充
1、语法格式:
(1) Awk完整语法
awk 'BEGIN{commands} pattern{commands}END{commands} ' file
BEGIN{commands}:处理数据前执行的命令。
END{commands}:处理完数据后执行的命令。
这两个命令可以省略。见(2)
(2) Awk基本语法
awk -F '分割符' '/模式/{动作} ' file
这里的 '/模式/{动作} ' 类似于sed的命令格式。
模式:
(1) 正则表达式(注意格式: /正则表达式/ )
(2) 条件表达式(例如:><等等)
总结:
这里的模式通俗来讲是 用来找谁, 而动作表示是 干啥。
2、 awk的命令 *** 作符
(1) 正则表达式与bash一致
(2) + - * / % ++ --
(3) &&|| !
(4) ><>= <= != == ~ !~
~:表示匹配后面的模式,用于字段,见 案例1 。
其余的都比较常见就不举例了。
3、案例
案例1:
~使用案例
awk -F : '$3 ~ /\<...\>/{print $1,$3}' /etc/passwd
解释:
模式:\<...\>
\<\>表示定界符,只匹配3个字符。
$3 ~:表示$3这个字段必须符合后面模式(\<...\>)的要求。
见如下输出结果,$3都是3个字符。
案例2:
% || ==使用案例
seq 100 | awk '$1 % 7 == 0 || $1 ~ /^99/{print $1}'
输出结果的要求:
整除7或者以99开头
案例3:
++使用
awk 'BEGIN{num=0}{num++}END{print num}' /etc/passwd
简单解释:
BEGIN{num=0}:定义一个变量num
{num++}:这里没有模式,只有动作。
即每匹配到文件/etc/passwd的一行就执行num++
END{print num}:文件遍历结束,打印num的值,即文件的行数。
这里我们使用wc -l验证也是没问题的。
cat /etc/passwd | wc -l
上面3个案例简单的使用了awk的命令 *** 作符。
虽然只是用到了几个简单的,但是其他同理,大家可以执行 *** 作。
下一篇:
Linux三剑客awk命令篇二之内部变量
欢迎大家给予宝贵的意见或者建议。
欢迎大家补充或者共享一些其他的方法。
感谢支持。
grep、sed、awk是linux功能非常强大的三个命令,grep是查找过滤文本,sed是对文本进行编辑替换,awk是对文本进行分析报告。 最简单的理解就是找什么东西用grep,想修改什么内容用sed,想格式化内容用awk。 创建一个文件名为grep_text.txt的文件,并放入内容: SillyMadman is both a madman and a fool. Everyone agrees with this sentence. 我要查找在grep_text.txt文件里有Silly的行 命令是: grep Silly grep_text.txt 会返回内容:SillyMadman is both a madman and a fool. 也可以带以下参数,这些我认为可能容易用到的参数,其它的参数需要另行查找 文档,比如可以使用正则进行匹配。 内容相关的 -B, --before context=NUM显示所在行之前的行数 -A, --after context=NUM显示所在行之后的行数 -C, --context=NUM打印输出上下文的行数 过滤内容相关的参数: -i, --忽略大小写区分 -w,--匹配查找的整个单词 -x,--匹配查找的整行文本 -v, --过滤掉匹配的内容 输出内容相关的参数 -n, --行号打印带有输出行的行号 比如,我要查找在grep_text.txt文件里不区分大小写查找sillymadman,并显示行号和匹配文本的下一行,那么我可以用以下命令查找 grep sillymadman grep_text.txt -i -n -A1 内容返回为 1:SillyMadman is both a madman and a fool. 2-Everyone agrees with this sentence. 总体而言grep的使用方式就是 grep [参数...](查找的内容) (文件名) grep也经常搭配管道符号"|"使用,比如我要查询某程序的进程,并去掉查找进程本身,那么命令为 ps -ef | grep program_name | grep -v grep 再创建一个文件名为sed_text.txt的文件,并放入内容: SillyMadman is both a madman and a fool. Everyone agrees with this sentence. 我想要在第一行下面添加一句:woshishazi 命令是:sed '1a\woshishazi' sed_text.txt 返回内容为: SillyMadman is both a madman and a fool. woshishazi Everyone agrees with this sentence. 但是以上这个命令不会修改原文件,如果需要,需要加上-i sed -i '1a\woshishazi' sed_text.txt 上面a是代表append,从指定行后面新的一行添加数据,还有其他 *** 作 *** 作有以下这些 a :从下面一行新增 i :从上面一行插入, d :删除 c :整行替换 p :打印 s :对指定内容进行替换 下面稍微举下例: a: sed '1a\woshishazi' sed_text.txt 从第一行后面添加 i: sed '1i\woshishazi' sed_text.txt 从第一行前面插入 d: sed '1d' sed_text.txt 删除第一行 c: sed '1c\woshishazi' sed_text.txt 替换第一行内容为woshishazi p: sed -n '1p' sed_text.txt 打印第一行,一般搭配-n使用,其他内容就不会再展示 s:这个相对复杂一点需要详细说明一下 sed的参数为 '[行]s/要被替换的内容/新的内容/g' 行是一个可选项,可以选择具体的行进行替换 g代表替换所有匹配到的内容,也可以改为数字,表示第几次匹配到时进行替换 sed 's\SillyMadman\shafengzi\g' sed_text.txt ,将所有SillyMadman替换为shafengzi 输出结果为: shafengzi is both a madman and a fool. Everyone agrees with this sentence. 最后再创建一个文件名为awk_text.txt的文件,并放入内容: 1 a 2 b 3 c 4 d 5 f 以空白符作为分隔符这个文本相当于每一行有两个字段。 那么打印第一个字段时 awk '{print 0的话,则代表打印所有字段 awk默认以空白符作为分隔符,也可以指定分割符通过-F awk -F: '{print $1}' awk_text.txt,以“:”作为作为分隔符 那么返回内容就为 1 a 2 b 3 c 4 d 5 f 相当于只有一列或者说一个字段 然后还可以对前面加上一个正则对行进行匹配内容 awk '/a/{print 2 ~ /a/){print $1}' awk_text.txt 返回内容为 1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)