プログラムの作成

プログラムの作成

私は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。これらの行の場合、最初と最後の区切り:フィールドが出力されます。

の出力は、標準のPOSIXロケールのアルファベット順に行をソートし、結果をコマンドラインで指定された名前のファイルに保存するようにawk渡されます。sort

コマンドラインにファイル名が指定されていない場合は、名前付き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最初のフィールドと最後のフィールドを教えてください。 2 つのフィールド間の空白文字がtr置き換えられます。:

関連情報