当前位置: 技术问答>linux和unix
Shell编程 正则表达式
来源: 互联网 发布时间:2016-03-01
本文导语: 说明:这是我的试验作业题,由于没有搞过shell编程,一点都不会。周一就要交作业了,希望高手帮我,谢谢。 正则表达式和Shell编程 背景介绍 假定你是一位Linux系统管理员,现在在你供职的公司中管理一台...
说明:这是我的试验作业题,由于没有搞过shell编程,一点都不会。周一就要交作业了,希望高手帮我,谢谢。
正则表达式和Shell编程
背景介绍
假定你是一位Linux系统管理员,现在在你供职的公司中管理一台Linux服务器。
作为一个系统管理员,每天最重要的任务之一就是管理系统的日志文件。假定现在你的手头有一个日志文件,它负责记录所有的登录请求。这个文件的格式如下:
日志文件名为:login.log
该日志文件中的信息都以行为单位;
所有日志文件中每一行记录都遵循如下格式:
用户帐号::登录日期和时刻::login (success ¦fail)
程序保证所有用户帐号都服从如下规则:
a、用户名只由数字、下划线和英文字母组成;
b、用户名必须以英文字母或下划线开始;
所有程序在写入新的日志信息时都是简单地将信息添加到文件末尾。所以该日志文件中的信息都是从旧排到新的。
一个用于调试的login.log实例位于oslesson/program目录下。
接下来我们的所有实验题,都围绕着如何处理这个文件中的信息进行。
题目一 利用正则表达式查找信息
系统管理员往往需要定期统计各个用户的登录情况,并做出报告。但是,一个系统的登录信息每天都会增加,这个日志通常都是非常巨大的。而且由于任何用户的登录都会记录在这个文件中,日志之中同一个用户登录的信息不可能都是连续的。如果管理员每次统计信息时总是一条一条记录地检查,那几乎不可能按时完成统计任务。如果我们有这样一种工具,只要指定我们要查找的用户帐号,它就能自动搜索满足需要那些信息并将其显示出来,无疑会大大减轻管理员的负担。
请利用正则表达式的有关知识,将给定文件中的所有root用户和John登录登录失败的信息记录全部找出来,并打印在屏幕上,请给出你使用的命令:
_______________________________________________________________
提示:本程序至少可以使用grep、sed或awk三者之一完成,如果某些同学熟悉Perl或Python等脚本语言,也可以用它们完成。
题目二 数据统计
有时候我们除了想知道我们要查找的信息之外,还想做一些简单的统计工作,比如,在上一题中,我们打印出了root和John的登录失败列表,有时我们还想知道我们到底找到了多少项。但这种工作要管理员一个一个去数就太累了,而且,当这个日志非常大,其中找到的记录项非常多时,一个一个数无疑是非常不现实的。这种烦人的工作,还是应该让机器来做比较好。
请根据上一题的结果,用一条命令算出我们在上一题中找到的记录的项目数,并用一句话显示在屏幕上。格式为:
Result:There are items.
其中 是我们上一题中找到的项目的个数。
请给出你使用的命令。 ________________________________________________________________
提示:Shell中可以用一对反引号“`”括起一条命令,表示把这命令的整个输出结果当成一个字符串使用。
Linux命令中,wc命令可以用来统计给定的文件的行数、单词数和ASCII字符数,同时,wc命令也是一个过滤器,它服从过滤器的所有设计要求。
Linux命令中,echo命令可以向屏幕打印信息。
题目三 一个简单但实用的Shell脚本
显然,以上两道题中我们写出的命令比前面写的那些要复杂得多,如果每一次查询都要这么写一遍的话太麻烦了。所以我们可以把它写在一个脚本文件里,需要的时候调用那个文件就可以了。
请编写一个脚本文件,它应该先显示出题目一的结果,接下来显示题目二的结果。为统一起见,我们要求这个脚本文件的名字叫做query。注意,Linux环境下的Shell不是唯一的,为了保证这个脚本文件的通用性,我们不应该要求管理员记住这个脚本是用什么语言写的。也就是说,这个文件必须能够在任何Shell环境下直接用命令行“./query”执行,而不允许使用诸如“sh query”的方式执行。
同时,请给出要想使这个脚本文件满足题目中关于文件可执行的要求需要对这个文件做的处理步骤,以及进行这些处理使用的命令(不多于两条)。
________________________________________________________________
题目四 扩展这个脚本
现在我们可以使用的脚本来轻松地统计我们想得到的数据了。但这个脚本还不够好,因为它太死板了,只能统计名字叫John和root的用户的登录信息,而且对输入文件的文件名的格式也有要求。如果这个脚本能够像那些Linux标准命令那样,通过各种命令行参数来指定行为的话,无疑能够大大提升这个脚本的通用性。
请利用Shell脚本的命令行功能改进题目三的脚本。该脚本我们命名为
query2,以与query向区别。这个脚本接受的命令行如下:
query2
其中,三个参数都是是必须出现的。如果命令行格式不满足要求,则程序应给出错误提示并退出。其中第三个参数的取值只能时success、fail或all三者之一,success表示给出用户成功登录的次数统计;fail表示给出用户登录失败的次数统计;all表示给出该用户所有的登录次数统计,包括成功和失败的。该脚本输出的格式和执行时的要求应与第三题相同。
提示:显然,要解决这一题就必须先掌握Shell命令行参数的引用方式和Shell的if语句。请自行查阅Shell程序设计的有关资料。
题目五 统计用户人数
仅仅是统计登录信息还是不够,如果管理员不知道日志中有哪些用户登记在案,那么按照我们上述的命令格式,这个程序就没有用武之地了。所以,我们还需要一个程序来统计一个日志文件中究竟有几个用户。
我们将这个程序命名为getusers,其接受的命令行格式如下:
getusers
其中,日志文件名是必须提供的。这个程序扫描给定的输入日志文件,并统计所有的用户名,最后在屏幕上按照一行一个的格式打印出所有的用户名。例如,某个输入日志文件中一共有user1、user2、user3三个用户的登录信息,则输出应该为:
user1
user2
user3
该程序的可执行特性与题目3要求相同。
提示:这个程序可以用Shell,也可以用awk脚本写,显然,这个程序不能简单地用一个查找语句解决,所以功能更强的awk可能更适合在这种场合使用。如果同学们不熟悉如何在awk中访问命令行参数,也可以使用在Shell脚本中调用awk的方法,用我们在前面学到的Shell处理命令行的方法处理命令行参数,用awk处理程序逻辑。
正则表达式和Shell编程
背景介绍
假定你是一位Linux系统管理员,现在在你供职的公司中管理一台Linux服务器。
作为一个系统管理员,每天最重要的任务之一就是管理系统的日志文件。假定现在你的手头有一个日志文件,它负责记录所有的登录请求。这个文件的格式如下:
日志文件名为:login.log
该日志文件中的信息都以行为单位;
所有日志文件中每一行记录都遵循如下格式:
用户帐号::登录日期和时刻::login (success ¦fail)
程序保证所有用户帐号都服从如下规则:
a、用户名只由数字、下划线和英文字母组成;
b、用户名必须以英文字母或下划线开始;
所有程序在写入新的日志信息时都是简单地将信息添加到文件末尾。所以该日志文件中的信息都是从旧排到新的。
一个用于调试的login.log实例位于oslesson/program目录下。
接下来我们的所有实验题,都围绕着如何处理这个文件中的信息进行。
题目一 利用正则表达式查找信息
系统管理员往往需要定期统计各个用户的登录情况,并做出报告。但是,一个系统的登录信息每天都会增加,这个日志通常都是非常巨大的。而且由于任何用户的登录都会记录在这个文件中,日志之中同一个用户登录的信息不可能都是连续的。如果管理员每次统计信息时总是一条一条记录地检查,那几乎不可能按时完成统计任务。如果我们有这样一种工具,只要指定我们要查找的用户帐号,它就能自动搜索满足需要那些信息并将其显示出来,无疑会大大减轻管理员的负担。
请利用正则表达式的有关知识,将给定文件中的所有root用户和John登录登录失败的信息记录全部找出来,并打印在屏幕上,请给出你使用的命令:
_______________________________________________________________
提示:本程序至少可以使用grep、sed或awk三者之一完成,如果某些同学熟悉Perl或Python等脚本语言,也可以用它们完成。
题目二 数据统计
有时候我们除了想知道我们要查找的信息之外,还想做一些简单的统计工作,比如,在上一题中,我们打印出了root和John的登录失败列表,有时我们还想知道我们到底找到了多少项。但这种工作要管理员一个一个去数就太累了,而且,当这个日志非常大,其中找到的记录项非常多时,一个一个数无疑是非常不现实的。这种烦人的工作,还是应该让机器来做比较好。
请根据上一题的结果,用一条命令算出我们在上一题中找到的记录的项目数,并用一句话显示在屏幕上。格式为:
Result:There are items.
其中 是我们上一题中找到的项目的个数。
请给出你使用的命令。 ________________________________________________________________
提示:Shell中可以用一对反引号“`”括起一条命令,表示把这命令的整个输出结果当成一个字符串使用。
Linux命令中,wc命令可以用来统计给定的文件的行数、单词数和ASCII字符数,同时,wc命令也是一个过滤器,它服从过滤器的所有设计要求。
Linux命令中,echo命令可以向屏幕打印信息。
题目三 一个简单但实用的Shell脚本
显然,以上两道题中我们写出的命令比前面写的那些要复杂得多,如果每一次查询都要这么写一遍的话太麻烦了。所以我们可以把它写在一个脚本文件里,需要的时候调用那个文件就可以了。
请编写一个脚本文件,它应该先显示出题目一的结果,接下来显示题目二的结果。为统一起见,我们要求这个脚本文件的名字叫做query。注意,Linux环境下的Shell不是唯一的,为了保证这个脚本文件的通用性,我们不应该要求管理员记住这个脚本是用什么语言写的。也就是说,这个文件必须能够在任何Shell环境下直接用命令行“./query”执行,而不允许使用诸如“sh query”的方式执行。
同时,请给出要想使这个脚本文件满足题目中关于文件可执行的要求需要对这个文件做的处理步骤,以及进行这些处理使用的命令(不多于两条)。
________________________________________________________________
题目四 扩展这个脚本
现在我们可以使用的脚本来轻松地统计我们想得到的数据了。但这个脚本还不够好,因为它太死板了,只能统计名字叫John和root的用户的登录信息,而且对输入文件的文件名的格式也有要求。如果这个脚本能够像那些Linux标准命令那样,通过各种命令行参数来指定行为的话,无疑能够大大提升这个脚本的通用性。
请利用Shell脚本的命令行功能改进题目三的脚本。该脚本我们命名为
query2,以与query向区别。这个脚本接受的命令行如下:
query2
其中,三个参数都是是必须出现的。如果命令行格式不满足要求,则程序应给出错误提示并退出。其中第三个参数的取值只能时success、fail或all三者之一,success表示给出用户成功登录的次数统计;fail表示给出用户登录失败的次数统计;all表示给出该用户所有的登录次数统计,包括成功和失败的。该脚本输出的格式和执行时的要求应与第三题相同。
提示:显然,要解决这一题就必须先掌握Shell命令行参数的引用方式和Shell的if语句。请自行查阅Shell程序设计的有关资料。
题目五 统计用户人数
仅仅是统计登录信息还是不够,如果管理员不知道日志中有哪些用户登记在案,那么按照我们上述的命令格式,这个程序就没有用武之地了。所以,我们还需要一个程序来统计一个日志文件中究竟有几个用户。
我们将这个程序命名为getusers,其接受的命令行格式如下:
getusers
其中,日志文件名是必须提供的。这个程序扫描给定的输入日志文件,并统计所有的用户名,最后在屏幕上按照一行一个的格式打印出所有的用户名。例如,某个输入日志文件中一共有user1、user2、user3三个用户的登录信息,则输出应该为:
user1
user2
user3
该程序的可执行特性与题目3要求相同。
提示:这个程序可以用Shell,也可以用awk脚本写,显然,这个程序不能简单地用一个查找语句解决,所以功能更强的awk可能更适合在这种场合使用。如果同学们不熟悉如何在awk中访问命令行参数,也可以使用在Shell脚本中调用awk的方法,用我们在前面学到的Shell处理命令行的方法处理命令行参数,用awk处理程序逻辑。
|
平时不努力,临时抱佛脚
现在的学生啊
现在的学生啊