我正在 Linux 中编写脚本,但在脚本文件中使用的命令时遇到一些问题。这就是我想要实现的目标:
查找文件 /etc/passwd 中包含短语“student”的所有行
获取这些结果的第一个和最后一个字段。
按字母顺序对行进行排序
将排序后的行放入用户指定的文件中
答案1
#!/bin/sh
outfile="${1:-out}"
if [ -e "$outfile" ]; then
printf 'The filename "%s" already exists, refusing to overwrite\n' "$outfile" >&2
exit 1
fi
awk -F':' '/student/ { print $1, $NF }' /etc/passwd | LC_ALL=C sort -o "$outfile"
该脚本用于awk
解析passwd
文件。它会跳过除包含字符串 的行之外的所有行student
。对于这些行,它将输出第一个和最后一个:
分隔字段。
的输出awk
被传递给sort
,它按照标准 POSIX 语言环境中的字典顺序对行进行排序,并将结果存储在一个文件中,该文件的名称在命令行上给出。
如果命令行上没有给出文件名,out
则会生成一个名为的文件。如果输出文件的名称已存在,则脚本将退出并出现错误。
$ chmod +x script
$ ./script output
输出可以output
在本示例中指定的文件中找到。
作为命令的替代awk
:
sed '/student/s/\([^:]*\):.*:\(.*\)$/\1 \2/' /etc/passwd | LC_ALL=C sort -o "$outfile"
这做了同样的事情,但是通过对包含字符串 的每一行应用替换student
。替换会将整行替换为第一个之前的内容:
,后跟一个空格,最后一个之后的内容:
。
由于passwd
格式众所周知,我们知道最后一列是第 7 列。这意味着我们可以使用这个简单的++ grep
,作为另一种选择:cut
tr
grep -F 'student' /etc/passwd | cut -d':' -f1,7 | tr ':' ' ' | LC_ALL=C sort -o "$outfile"
查找grep
文件中我们感兴趣的所有行。cut
为我们提供第一个和最后一个字段。将用空格字符tr
替换两个字段之间的 。: