linux grep 括号 变量,linux 常用命令基础用法awk sed grep

awk 基础概念

Awk把文件(或其他方式的输入流, 如重定向输入)看作一个记录集, 把每一行看作一条记录, 把每一行中以空格(或/t,或用户自己指定的分隔符)分割的字符串看作一个字段. 这似乎把文件记录看成数据库. 但是, awk仍然以行为单位逐行处理. 本例子以下面的文件(命名为s.txt)内容做演示:

s.txt代码如下:

zhangsan 1977 male computer 83

lisi 1989 male math 99

wanglijiang 1990 female chinese 78

xuliang 1977 male economic 89

xuxin 1986 female english 99

wangxuebing 1978 male math 89

lichang 1989 male math 99

wanglijiang 1990 female chinese 78

zhangsansan 1977 male computer 83

langxuebing 1978 male math 89

lisibao 1989 male math 99

xiaobao 1990 female chinese 78

一行中的5个字段分辨表示姓名, 出生年, 性别,科目,分数, 是一个很传统很典型的报表文件.

Awk基本语法: awk ‘pattern1 {command1;command 2…; command 3}pattern2 { command …}’

pattern表示用来过滤记录的模式, 可是是正则表达式, 关系运算表达式, 也可以什么也没有(表示选中所有记录);

每个pattern选中的行记录会被花括号括起来的命令command操作一遍, command之间用;分割. 花括号里面可以什么也没有, 则默认为print输出整行记录. Comamnd可以是输出, 可以是算术运算, 逻辑运算, 循环控制等等.

先看几个例子, 以建立对awk的命令直观的了解.

代码如下:

变量

说明

awk ‘/1990/’ s.txt

#//直接输出1990年出生的同学;

awk ‘/chinese/{print “语文”; print “语文”}’s.txt

#// 对chinese的课程的行输出两行”语文 +”;

awk ‘20>1{print “Yes”}’ s.txt

#//因为20>0,所以每行输出Yes;

awk 'BEGIN{print "Result of the quiz:/n"}{print}END{print"---------------------------"}' s.txt

结果:

变量: 上面说到command可以是算术运算, 所及运算等, 则既然有运算, 就有常量变量, awk可以自定义变量(不需要提前声明, 但最好在BEGIN里面给它初始化). Awk也维护了一组程序变量:

变量

说明

$0

当前记录;

$1, $2, … $n

当前记录的字段

FILENAME

当前的文件名

FS

输入字段的分隔符, 可通过-F修改. 如: 先通过sed把空格替换为|,然后管道输送给awk: sed 's/ /|/g' s.txt | awk -F '|' '/chinese/{print FILENAME, $1, $5}'

NF

当前记录的字段数

NR

当前记录编号

OFS

输出字段分隔符

ORS

输出记录分隔符

RS

记录分隔符, 默认为换行符

给一些例子来说明这些变量的用法:

代码如下:

变量

说明

awk ‘

math?formula=4%3D%3D%E2%80%9Dchinese%E2%80%9D%7Bprint%20NR%2C%20%5C1, $4, $5}’ s.txt

#//第四个字段科目为chinese的记录编号, 学生姓名, 科目和成绩.

awk ‘$2~/1990/{print $1}’ s.txt

#//找出1990年出生的学生姓名, ~表示匹配正则表达式

awk ‘$2!~/1990/{print $1}’ s.txt

#//找出不是1990年出生的学生姓名, !~表示不匹配正则表达式

awk ‘$2>”1985”{print $1, $2}’ s.txt

#//找出大于1985年出生的学生姓名,年龄

awk ‘END{print “total: ” NR ”/n----------------” }’ s.txt

awk ‘BEGIN{goodChinese=0; goodMath=0}($4==”chinese”||$5>90){goodChinese++}END{print“”}

sed

变量

说明

sed '2,5d' file

显示文件file,除去2-5行,但行数超过文件实际行数时不会报错。

sed '/10[1-4]/d' file

显示文件file,除去包含101-104的行。

sed '2,$d' file

显示文件,只显示第一行。sed '2,$!d' file则只显示除第一行外的其它行。

sed '/^ *$/d file

删除文件中的空行。

sed -n '/10[1-4]/p' file

只显示文件file中包含101-104的行。(n和p必须同时使用,否则只有p时显示全部文件并多显示一次找到的行)

sed -n '5p' file

只显示文件的第5行

sed 's/moding/moden/g' file

将moding替换为moden

sed -n 's/^west/north/p' file

将west开头的行替换为north并显示出来。

sed 's/[0-9][0-9][0-9]$/&;.5/' file

将file文件中以3个数字结尾的行替换为原数字加".5",&;代表搜索到的字符串。

sed 's/moding//1en/g file

将mod做为模式1封装在括号里,然后替换。

sed 's/...$//' file

删除每一行的最后三个字符。

sed 's/^...//' file

删除每一行的头三个字符。

sed 's#moding#moden#g' file

将moding替换为moden,s后面的#代表搜索串和替换串之间的分界符。

sed -n '/101/,/105/p' file

显示从101的匹配行到105的匹配行。如果只找到101的匹配行,则从101的匹配行到文件末。

sed -n '2,/999/p' file

显示从第2行到匹配行。

sed'/101/,/105/s/$/ 20050119/' file

将从101的匹配行到105的匹配行的行末增加" 20050119"内容。

sed -e '1,3d' -e 's/moding/moden/g'file

先删除文件的1-3行,再进行替换。

sed -e '/^#/!d' file

显示文件以#开头的行。

sed '/101/r newfile' file

在每个匹配行增加文件newfile的内容

sed '/101/w newfile' file

把匹配行写入newfile。

sed '/101/a new text' file

在匹配行后增加一新行。

sed '/101/i' new text' file

在匹配行前增加一新行。

sed '/101/c new text' file

用新行替换匹配行。

sed 'y/abcd/ABCD/' file

将a、b、c、d分别替换为ABCD。

sed '5q' file

显示到第5行时退出。

sed '/101/{ n; s/moding/moden/g; }' file

在文件中找到匹配行的后一行(n)再进行替换。

sed '/101/{ s/moding/moden/g; q; }' file

在文件中找到第一个匹配行后进行替换后再退出。

sed -e '/101/{ h; d; }' -e '/104/{ G; }'file

在文件中找到与101匹配行后先存在一个缓存中,再放在与104匹配行后。

sed -e '/101/{ h; d; }' -e '/104/{ g; }'file

在文件中找到与101匹配行后先存在一个缓存中,再替代104的匹配行。

sed -e '/101/h' -e '$G' file

将最后一个匹配行放在文件末。

sed -e '/101/h' -e '$g' file

将最后一个匹配行替换文件末行。

sed -e '/101/h' -e '/104/x' file

在文件中找到与101匹配行后先存在一个缓存中,再与104的匹配行进行互换。

echo –ltr 1.txt | sed‘s/^.* //’

找出文件名

grep 常用的grep选项

变量

说明

-c

只输出匹配行的计数。// 这条有时候很有用, 不需要再

wc -l

-i

不区分大小写(只适用于单字符)。

-h

查询多文件时不显示文件名。

-l

查询多文件时只输出包含匹配字符的文件名。

-n

显示匹配行及行号。

-s

不显示不存在或无匹配文本的错误信息。

-v

显示不包含匹配文本的所有行。

例子

变量

说明

grep -v "Sort" tab2

显示不包含匹配文本的所有行

grep -n "Sort" tab2

显示匹配行及行号

grep -c "Sort" tab2

只输出匹配行的计数

grep "01">" tab2

精确匹配

grep -in "code" tab2

忽略大小写

grep -in "code" tab2 | grep "02"

多次过滤

补充说明,grep 家族还包括fgrep和egrep。fgrep是fix grep, 允许查找字符串而不是一个模式,运算速度快,适合于从大量数据中进行检索;egrep是扩展grep,支持基本及扩展的正则表达式,可用()及|等,但不支持q模式范围的应用及与之相对应的一些更加规范的模式。

| 变量| 说明 |

-|-

echo aAA123bbb |egrep '[0-9]*'||

echo AAA123bbb | egrep -i '^a' ||

以上是总结Linux中用于文本处理的awk、sed、grep命令用法的内容,更多 用法文本命令用于总结处理Linuxgrepsedawk的内容,请您使用右上方搜索功能获取相关信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值