背景:使用awk从日志中解析出对应的字段;
日志格式如下所示,需要解析出ip、date、url以及action取值;其中action的位置不固定,不一定是作为第一个参数出现
10.10.10.10 - - [31/Jul/2013:03:30:44 +0000] GET /url?action=dosometion&a=0&b=20&c=0&d=66&e=3&f=3&g=20 HTTP/1.1 "200"
分析:前面三个字段都可以通过简单的分割来获取,只是最后一个action字段,因为位置不固定,导致无法直接通过分割获取。好在,awk提供了相关的字符串函数供我们使用。
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
从上面的函数中,我们发现,substr这个函数可以帮助我们取回想要的字符串;只要通过index获取到对应的位置;但是为了定位真正的长度,需要split配合使用,找到结束符&的位置。
实现实例:
awk -F'[ ?&=]' '{split($0,mydata,"action="); print $1,$4,$7, substr(mydata[2], 0, index(mydata[2], "&")-1)}' access.log-20130731 > tmp2.log
其中,split把整行划分为两部分,“action=”前面的部分和后面的部分。之后,通过index函数,定位“action=”后第一个出现的“&”的位置,并通过substr函数,把action的值取出来。需要注意的是,substr使用的时候,函数中的index函数返回的位置,必须是基于substr中传入的字符串而言,否则,会出现错误的结果。
提醒:基于字符串的操作,是非常耗性能的。如果不是必须,不要使用字符串操作函数,尽可能利用分割获取对应的取值。上述例子,同样大小的文件,如果action的位置固定,直接使用分割获取和采用字符串函数获取,性能相差几十倍以上。
分享到:
相关推荐
在给定的文件信息中,我们探讨了AWK这一强大文本处理工具中的算数函数、字符串函数以及其他功能,包括时间函数。以下是对这些知识点的详细解释: ### 算数函数 1. **atan2(y,x)**:此函数计算坐标 (x,y) 的角度...
在编程世界中,awk 是一个强大的文本分析工具,尤其在处理和分割字符串方面表现出色,它能够优雅地处理多个连续空格。然而,在 Python 中,`str.split()` 方法默认会将每个空格视为一个分隔符,导致多个连续空格被...
* 字符串函数:awk 中有多种字符串函数,如 sub、gsub、index、substr、split、length、match 等,用于对字符串进行操作。 * 数学函数:awk 中有多种数学函数,如 atan2、cos、exp、int、log、rand、sin、sqrt 等,...
在日常的Shell脚本开发工作中,我们经常需要处理字符串,其中计算字符串长度是一个常见的需求。本文将详细介绍五种在Shell脚本中计算字符串长度的方法,并对每种方法进行详细的解析,帮助读者更好地理解和掌握这些...
`awk match` 用于查找子字符串在字符串中的位置。 #### 十、替换字符串 在 Linux 中,可以使用 Bash 内置的字符串替换功能或者 `awk` 和 `sed` 命令来进行字符串替换。 1. **使用 `${variable//pattern/...
以上内容详细介绍了 Linux 下 AWK 的内置函数,包括算术函数和字符串函数。这些函数可以帮助开发者在进行文本处理时更加灵活高效。通过这些函数,我们可以轻松实现数据过滤、字符串操作等功能,从而提高工作效率。
* 使用 awk 分割字符串:`awk 'BEGIN {split("123#xuyunbo#aini", dong1, "#"); print dong1[1]}'` * 使用 awk 生成报表:`awk -f awk4.sh` awk 是一个功能强大且灵活的文本处理工具,广泛应用于 Linux 系统中的...
Shell 字符串截取是指在 Shell 编程中对字符串进行截取、查找、替换等操作。下面将详细介绍 Shell 字符串截取的知识点。 一、字符串截取 Shell 字符串截取可以使用多种方法,以下是一些常见的方法: 1. 使用 expr...
书中详细介绍了字符串函数,如length、index、sub、gsub等,以及如何进行字符串的拼接和比较。此外,书中还涵盖了数组的使用,包括关联数组和数值数组,它们允许开发者存储和处理多组相关数据。 模式匹配是awk的一...
awk 有多种函数,包括数学函数、字符串函数、时间函数等。数学函数包括 sqrt、sin、cos 等,字符串函数包括 substr、index、match 等,时间函数包括 systime、strftime 等。 awk 的应用 awk 的应用非常广泛,包括...
Awk的强大之处在于它内置了丰富的内建函数,可以轻松处理数值计算、字符串操作以及文件操作。 在《Sed与Awk》这本书中,读者可以深入学习到: 1. Sed的基本概念:了解Sed的工作流程,包括命令行选项、模式空间、...
awk还具备大量的内置函数,这些函数可以分为数值函数、字符串函数和系统函数三类。数值函数包括了三角函数、指数、对数和平方根等。字符串函数有用于长度计算、索引查找、子字符串操作、字符串分割等,nawk和gawk...
`awk`的`substr`函数用于提取字符串的一部分。 3. 使用`cut`命令: ```bash echo "$a"|cut -c1-8 ``` `cut`命令的`-c`选项用于指定字符范围。 4. 使用`expr`的模式匹配: ```bash echo $5:expr "$a" : '\(....
- **函数**:`awk` 内置了多个函数,如 `split()` 分割字符串,`printf()` 格式化输出等,同时可以编写自定义函数。 - **BEGIN 和 END 规则**:`BEGIN` 规则在处理任何输入前执行,`END` 规则在处理完所有输入后...
awk还提供了许多内置的字符串函数,如`length(str)`返回字符串长度,`split(str, arr, fs)`根据分隔符fs将str分割成数组arr,`index(str1, str2)`返回str2在str1中的位置,`substr(str, pos[, len])`返回str从pos...
AWK的语法简洁,提供了丰富的内置函数和灵活的数据处理能力,使得它成为数据处理领域中的一个利器。AWK也能够与其他程序交互,进一步拓展了其应用范围。对于任何需要处理文本数据的用户,AWK都值得学习和掌握。
Awk的特殊变量如OFS,以及printf函数中的格式说明符可以用于复杂的格式化需求,例如: - **转义序列**: 例如/b、/f、/n、/r分别表示退格、换页、换行、回车。 - **格式说明符**: 用于指定数据类型的显示格式,例如%...