awk过滤字符
① 利用awk命令提取其中一列包括特定字符的所有行怎么办
awk:用于一行中分成数个“字段”来处理。适合处理 小型数据。
运行内模式:awk '条件类型容1{动作1} 条件类型2{动作2} ...' filename
# last | awk '{print $1 "\t" $3}' <== 查看登录者的数据,只显示登录名和ip地址,并以[tab]隔开
awk 的内置变量
变量名称 代表的含义
NF 每一行($0)拥有的字段总数
NR 当前 awk 所处理的是 “第几行” 数据
FS 当前分隔符,默认空格键
awk 的逻辑运算符
运算单元 代表含义
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于
范例:
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' <== 文件/etc/passwd是以":"分隔的,查看第三栏小于10的数据,并且只显示帐号与第三栏
② AWK如何完全匹配而不是模糊匹配取出字符串数据
awk '/^abc$/{print $1}' A.txt
这样就好了,^这个符号是匹配开头,$这个符号是匹配结尾,这样就表示整行匹配
③ 在awk中怎么把一行中的字符串后的\n去掉
awk '{printf $0}' xxx
printf默认不换行的,print是默认换行输出,你用不换行的输出就去掉了最后的一个\n了
④ 如何使用 awk 和正则表达式过滤文本或文件中的字符串
正则表达式的特点
正则表达式由以下内容组合而成:
普通字符,例如空格、下划线、A-Z、a-z、0-9。
可以扩展为普通字符的元字符,它们包括:
(.)
它匹配除了换行符外的任何单个字符。
(*)
它匹配零个或多个在其之前紧挨着的字符。
[ character(s) ]
它匹配任何由其中的字符/字符集指定的字符,你可以使用连字符(-)代表字符区间,例如 [a-f]、[1-5]等。
^
它匹配文件中一行的开头。
$
它匹配文件中一行的结尾。
\
这是一个转义字符。
你必须使用类似 awk 这样的文本过滤工具来过滤文本。你还可以把 awk 自身当作一个编程语言。但由于这个指南的适用范围是关于使用 awk 的,我会按照一个简单的命令行过滤工具来介绍它。
awk 的一般语法如下:
# awk 'script' filename
此处
'script'
是一个由 awk 可以理解并应用于 filename 的命令集合。
它通过读取文件中的给定行,复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。
该脚本
'script'
中内容的格式是
'/pattern/ action'
,其中
pattern
是一个正则表达式,而
action
是当 awk 在该行中找到此模式时应当执行的动作。
如何在 Linux 中使用 awk 过滤工具
在下面的例子中,我们将聚焦于之前讨论过的元字符。
一个使用 awk 的简单示例:
下面的例子打印文件 /etc/hosts 中的所有行,因为没有指定任何的模式。
# awk '//{print}' /etc/hosts
awk 打印文件中的所有行
结合模式使用 awk
在下面的示例中,指定了模式
localhost
,因此 awk 将匹配文件
/etc/hosts
中有
localhost
的那些行。
# awk '/localhost/{print}' /etc/hosts
awk 打印文件中匹配模式的行
在 awk 模式中使用通配符 (.)
在下面的例子中,符号
(.)
将匹配包含 loc、localhost、localnet 的字符串。
这里的正则表达式的意思是匹配 l一个字符c。
# awk '/l.c/{print}' /etc/hosts
使用 awk 打印文件中匹配模式的字符串
在 awk 模式中使用字符 (*)
在下面的例子中,将匹配包含 localhost、localnet、lines, capable 的字符串。
# awk '/l*c/{print}' /etc/localhost
使用 awk 匹配文件中的字符串
你可能也意识到
(*)
将会尝试匹配它可能检测到的最长的匹配。
让我们看一看可以证明这一点的例子,正则表达式
t*t
的意思是在下面的行中匹配以
t
开始和
t
结束的字符串:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
当你使用模式
/t*t/
时,会得到如下可能的结果:
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
在
/t*t/
中的通配符
(*)
将使得 awk 选择匹配的最后一项:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
结合集合 [ character(s) ] 使用 awk
以集合 [al1] 为例,awk 将匹配文件 /etc/hosts 中所有包含字符 a 或 l 或 1 的字符串。
# awk '/[al1]/{print}' /etc/hosts
使用 awk 打印文件中匹配的字符
下一个例子匹配以
K
或
k
开始头,后面跟着一个
T
的字符串:
# awk '/[Kk]T/{print}' /etc/hosts
使用 awk 打印文件中匹配的字符
以范围的方式指定字符
awk 所能理解的字符:
[0-9]
代表一个单独的数字
[a-z]
代表一个单独的小写字母
[A-Z]
代表一个单独的大写字母
[a-zA-Z]
代表一个单独的字母
[a-zA-Z 0-9]
代表一个单独的字母或数字
让我们看看下面的例子:
# awk '/[0-9]/{print}' /etc/hosts
使用 awk 打印文件中匹配的数字
在上面的例子中,文件 /etc/hosts 中的所有行都至少包含一个单独的数字 [0-9]。
结合元字符 (^) 使用 awk
在下面的例子中,它匹配所有以给定模式开头的行:
# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts
使用 awk 打印与模式匹配的行
结合元字符 ($) 使用 awk
它将匹配所有以给定模式结尾的行:
# awk '/ab$/{print}' /etc/hosts
# awk '/ost$/{print}' /etc/hosts
# awk '/rs$/{print}' /etc/hosts
使用 awk 打印与模式匹配的字符串
结合转义字符 (\) 使用 awk
它允许你将该转义字符后面的字符作为文字,即理解为其字面的意思。
在下面的例子中,第一个命令打印出文件中的所有行,第二个命令中我想匹配具有 $25.00 的一行,但我并未使用转义字符,因而没有打印出任何内容。
第三个命令是正确的,因为一个这里使用了一个转义字符以转义 $,以将其识别为 '$'(而非元字符)。
# awk '//{print}' deals.txt
# awk '/$25.00/{print}' deals.txt
# awk '/\$25.00/{print}' deals.txt
⑤ awk如何替换一个字符串的第n个字符
示例:
上例中将第六个字符f替换为了A
应该还有很多方法能够实现,可以进行摸索
⑥ 如何使用 awk 和正则表达式过滤文本或文件中的字符串
awk默认使用空格做为分隔符,可以看到,我输出了"a b c d e" 每个字母之间都有个空格
刚好我可以利用awk默认使用空格作为分隔符这一特点来进行分割过滤
这样过滤出来的第一列就是a,第二列就是b......以此类推。
如果有复杂的、难处理的可以继续追问,我也很喜欢解决这些问题
⑦ 如何用awk 来获取一个字符串中某些个特定的字符
假设有字符串:
str="abcdefg"要截取c和f之间的字符串,得到de。
可以用split函数,以c和f为分隔符,将字符串分割,内取分割后的第二容个字段。
echo "$str" | awk '{split($0,a,"[cf]");print a[2]}'
另一种方法,也可以分别计算出c和f在字符串中的位置,然后根据截取字符串的起始位置(c的位置+1)和截取长度(f的位置-c的位置-1),用substr函数来得到截取后的字符串。
⑧ awk如何使用regex排除某个字符串
使用 !/正则/{ }
或 $0 !~ /正则/{ }
表示不匹配正则时,执行后面的内容
正则中排除字符的写法 是 [^字符]
如果是多个字符,排除字串,需要使用 环视
⑨ 如何使用Awk过滤文本或字符串使用模式特定操作 –
awk只能某一个分隔符切割字符串 ` echo "aa,bb,cc"|awk -F ',' '{print $1} '` 输出结果就是aa $1 就是第一项 $NF是最后一项 你这种分隔符不一致的没法用awk分割啊
⑩ 如何用sed或awk提取方括号中字符串
基本思路,先用逗号做分割,然后过滤出d=开头的字符串,清掉中括号,提内取出里面的内容:
例如:容
echoa=[asdfghjk],b=[],c=[],d=[asdfghjklkjhgfds1234sdfgh]|awk-F","'{for(i=1;i<=NF;++i)print$i}'|awk'gsub("d=",""){gsub("^\[","",$0);gsub("\]$","");print$0}'