私は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
、代わりにこの単純な++を使用できることを意味します。cut
tr
grep -F 'student' /etc/passwd | cut -d':' -f1,7 | tr ':' ' ' | LC_ALL=C sort -o "$outfile"
grep
ファイル内の関心のあるすべての行を見つけます。cut
最初のフィールドと最後のフィールドを教えてください。 2 つのフィールド間の空白文字がtr
置き換えられます。: