grep习题.md
### Grep命令详解 #### 1. 找出/proc/meminfo文件中,所有以大写或小写s开头的行 为了找到`/proc/meminfo`文件中所有以字母`s`(不论大小写)开头的行,可以通过以下几种方式实现: - **使用正则表达式和忽略大小写的选项**:`grep -E-i '^s' /proc/meminfo`。这里`-E`表示支持扩展正则表达式,`-i`表示忽略大小写,`^s`表示匹配以`s`开头的行。 - **同时匹配大写和小写字母**:`grep -E '^(s|S)' /proc/meminfo`。这里`-E`表示支持扩展正则表达式,`^`表示行的开始,`(s|S)`表示匹配`s`或`S`。 - **单独指定大小写**:`grep -E-i '^S' /proc/meminfo`。虽然这种方式看似只匹配大写的`s`,但由于加上了`-i`选项,它同样可以匹配小写的`s`。 #### 2. 显示当前系统上root、centos或user1用户的相关信息 使用正则表达式来精确匹配这些用户名,确保它们作为独立的词出现: ``` grep -E '^\b(root|centos|user1)\b' /etc/passwd ``` 这里`-E`表示支持扩展正则表达式,`-b`表示词边界,确保完整匹配用户名。 #### 3. 找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行 为了匹配一个单词后面跟着一个小括号,可以使用Perl兼容的正则表达式: ``` grep -P '\b\w+\b\(\)' /etc/rc.d/init.d/functions ``` 这里`-P`表示使用Perl兼容的正则表达式,`\b\w+\b`匹配一个完整的单词,`\(\)`匹配一个括号。 #### 4. 使用echo命令输出一绝对路径,使用grep取出其(路径最后的文件名)基名 要提取一个路径中的文件名部分,可以利用Perl兼容的正则表达式匹配路径末尾非斜杠的字符: ``` p=/etc/sysconfig/network-scripts/ifcfg-ens33 echo $p | grep -P-o '[^/]+$' ``` 这里`[^/]+`表示匹配一个或多个非斜杠字符,`$`表示行的结尾。 #### 5. 取出其路径名,类似dirname命令的结果 为了提取路径中的目录部分,可以使用Perl兼容的正则表达式匹配以斜杠开始的部分: ``` p=/etc/sysconfig/network-scripts/ifcfg-ens33 echo $p | grep -P '^/.*/' ``` 这里`^/.*`表示匹配以斜杠开始直到下一个斜杠之前的所有字符。 #### 6. 找出ifconfig命令结果中1-255之间的数值 为了匹配1到255之间的数值,可以按位数分别匹配: ``` ifconfig | grep -E '\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b' ifconfig | grep -P '\b([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\b' ``` 这里`-E`用于扩展正则表达式,`-P`用于Perl兼容的正则表达式,`[1-9]`匹配1到9之间的任意数字,`\d`匹配任何数字。 #### 7. 添加用户bash、testbash、basher以及nologin;然后找出/etc/passwd文件用户名同shell名的行 为了查找用户名与shell名相同的行,可以使用括号来分组并匹配相同的部分: ``` useradd bash useradd testbash useradd basher useradd -s /sbin/nologin nologin grep -P '^(\b(\w+)\b).*\1$' /etc/passwd ``` 这里`-P`表示使用Perl兼容的正则表达式,`(\b(\w+)\b)`将用户名作为一个组,`.*\1$`表示任何字符后跟着第一个组的内容,确保用户名和shell名相同。 #### 8. 获取ifconfig中命令的ip地址,使用三种方式实现 - **使用Perl兼容的正则表达式**:`ifconfig | grep -P '\b(([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-4])\b'` - **使用零宽度断言**:`ifconfig | grep -E '(?<=inet).*(?=netmask)'` - **简单匹配IP地址格式**:`ifconfig | grep -P '(\d{1,3}\.){3}\d{1,3}'` #### 9. 只在目录中所有的.php和.html文件中递归搜索字符"main{}" 为了在特定类型的文件中搜索特定字符,可以使用以下命令: ``` grep -P-r --include *.{php,html} "main\{\}" . grep "main\{\}" -r --include *.{php,html} grep "html" -r --include *.html ``` 这里`-P`表示使用Perl兼容的正则表达式,`-r`表示递归搜索,`--include *.{php,html}`指定只包含`.php`和`.html`文件。 #### 10. 在搜索结果中排除所有README文件 为了排除特定文件,可以使用`--exclude`选项: ``` grep -P-r --exclude "README" grep "main\{\}" -r --exclude "README" grep "html" -r --exclude "README" ``` 这里`--exclude "README"`表示排除名为`README`的文件。 #### 11. 在搜索结果中排除filelist文件列表里的文件 为了排除文件列表中的文件,可以使用`--exclude-from`选项: ``` grep -P-r --exclude-from filelist grep "main\{\}" -r --exclude-from filelist grep "html" -r --exclude-from filelist ``` 这里`--exclude-from filelist`表示从文件`filelist`中读取要排除的文件名。 #### 12. 在多级目录中对文本进行递归搜索 为了在多级目录中递归搜索文本,可以使用以下命令: ``` grep "string" -r -n grep -r -n '/sbin/nologin' e ``` 这里`-r`表示递归搜索,`-n`表示显示匹配的行号。