用shell命令/etc/passwd文件匹配“oo”前面不是字母的行,并显示行号
时间: 2024-09-30 21:11:56 浏览: 33
在 shell 中,我们可以使用 `grep` 和 `awk` 命令结合来完成这个任务。首先,`grep` 可以用来查找包含特定模式的行,而 `awk` 可以帮助我们判断行首字符是否为字母以及显示行号。下面是一个示例步骤:
```sh
# 使用 grep 查找含有 "oo" 的行
grep -l 'oo' /etc/passwd | while read line; do
# 使用 awk 检查行首字符,如果不是字母则打印行号
echo -n "$(tac $line) (row $(head -n 1 $line | awk '{print NR}'))" | tail -n +2
done
```
这里解释一下步骤:
1. `grep -l 'oo' /etc/passwd`:找到所有包含 "oo" 字符串的行并列出对应的文件名(/etc/passwd),因为我们需要后续读取文件,所以使用 `-l` 选项只输出文件名。
2. `while read line`:将每行文件名读入变量 `$line`,然后进入循环。
3. `awk '{print NR}'`: 运行 awk,在行首获取行号(NR表示当前记录序号)。
4. `head -n 1 $line`:取出行首内容。
5. `awk '{if(NR == 1 && !isalpha($0[1])) print ...}'`:如果这是第一行(NR == 1),并且第一个字符不是字母(`!isalpha()` 函数检查),那么打印行号和其他信息。
6. `tac $line`:由于awk默认从第2行开始处理,我们需要先反向读取(tac),然后再过滤,最后使用 `tail -n +2` 排除awk处理的首行。
注意,这个脚本假设 `/etc/passwd` 文件的第一列是用户名,如果结构不同,可能会需要调整awk的部分。另外,这个例子假设 `isalpha` 函数已存在,实际操作中可能需要自定义或查阅相应工具库。
阅读全文