编写程序

编写程序

我正在 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,作为另一种选择:cuttr

grep -F 'student' /etc/passwd | cut -d':' -f1,7 | tr ':' ' ' | LC_ALL=C sort -o "$outfile"

查找grep文件中我们感兴趣的所有行。cut为我们提供第一个和最后一个字段。将用空格字符tr替换两个字段之间的 。:

相关内容