shell脚本(AIX):在文件中逐行查找匹配模式后的字符串

时间:2012-12-07 11:35:29

标签: linux shell unix aix

我在AIX环境中有一个日志文件,其中包含如下所示的行

10.100.108.23 100.10.10.11 - [05/Dec/2012:09:35:27 +0000] "GET /chgs/checkprofile/checkServlet?requestType=signPart1&off=false&oquestions=true&userid=false&source=false&link=%23&country=us&language=en&origin=&displayLayer=no HTTP/1.1" 200 8904 "https://www.test.com/services/request/Home.action" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)" "PD-ERR=; rlang=nl_NL;

我需要找到分别位于模式&country&language之后的每一行的国家/地区和语言。由于我是shell脚本的新手,我试图用grep和awk脚本实现这一点,但没有运气。

2 个答案:

答案 0 :(得分:2)

awk -F"&" '{for(i=1;i<=NF;i++)if($i~/country/ ||$i~/language/){split($i,a,"=");printf a[2]" "}}' your_file

或者您可以使用sed:

sed -e 's/.*country=//g;s/language=\([^\&]*\)&.*/\1/g' your_file

删除&符号:

> sed -e 's/.*country=//g;s/&language=\([^\&]*\)&.*/ \1/g' temp
us en

您可以阅读this

答案 1 :(得分:1)

使用grep

$ grep -Eo '(country|language)=[^&]*' file
country=us
language=en

$ grep -Po '(?<=country=|language=)[^&]*' file
us
en

#  Grep Options

-o, --only-matching       show only the part of a line matching PATTERN
-E, --extended-regexp     PATTERN is an extended regular expression (ERE)
-P, --perl-regexp         PATTERN is a Perl regular expression

使用sed

sed -E 's/.*country=([^&]*).*language=([^&]*).*/\1 \2/g' file
us en 

# Sed option

-E use extended regular expression