2012-12-07 64 views
-1

我在AIX环境中有一个像下面shell脚本(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

1 http://whathaveyoutried.com? (请编辑你的问题)。 2.你使用的是linux还是aix?或者两者都使用? (将aix计为unix),除非您在那里安装了GNU coreutils,否则Aix将需要最低公分母解决方案。 – shellter

+0

请发布迄今为止您尝试过的grep和awk脚本,否则问题可能会被关闭。 – davidethell

回答

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

+0

非常感谢你!第二个给我的输出,但他们之间有一个符号(&)符号。我怎样才能删除?我可以在两者之间添加下划线(_)吗? – user1746666

+1

您将tegex更改为's /.* country = // g; s /&language = \([^ \&] * \)&。*/\ 1/g' – Vijay

+0

非常感谢。你的第三个选项就像没有'&'的魅力一样。我想知道模式背后的逻辑。请让我知道我在哪里可以学习这些。 – user1746666

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 
+0

因为我使用AIX,所以-o在那里不被识别。请告诉我o的用法,以便我可以在AIX中找到替代方案 – user1746666

+1

已更新的答案... –

+0

感谢您的帮助。希望这可以帮助那些不使用AIX的人。 – user1746666

相关问题