共通フィールドを持つ2つのファイルがあるとします。このファイル内のフィールド(たとえば、数値フィールド)に基づいて最初のファイルをソートしたいと思います。しかし、この並べ替えが通常のフィールドを介して他のファイルでも機能するようにしたいと思います。
例えば--完全虚空でそれをつかむ;-) - それを得る/etc/パスワードそして/etc/shadow:
/etc/passwd: (...) sshd:x:124:65534::/var/run/sshd:/usr/sbin/nologin sndiod:x:999:29::/var/lib/sndiod:/usr/sbin/nologin dictd:x:125:135:Dictd サーバー,,,::var/lib/dictd:/bin/false postgres:x:126:136:PostgreSQL 管理者,,,:/var/lib/postgresql:/bin/bash (...)
/etc/shadow: (...) SSHD:*:17055:0:99999:7::: sdiod:!:17055:::::: 辞書:*:17055:0:99999:7::: ポストグレス:*:17055:0:99999:7::: (...)
種類/etc/パスワードUIDの数字は簡単です。
sort -n -t: -k3 /etc/passwd > pw
上記の行の結果は次のとおりです。
/etc/passwd: (...) sshd:x:124:65534::/var/run/sshd:/usr/sbin/nologin dictd:x:125:135:Dictd サーバー,,,::var/lib/dictd:/bin/false postgres:x:126:136:PostgreSQL 管理者,,,:/var/lib/postgresql:/bin/bash sndiod:x:999:29::/var/lib/sndiod:/usr/sbin/nologin (...)
しかし、/etc/shadowするいいえ後で並べ替えることができる数値UIDフィールドがありますが...はい。/etc/パスワード- ユーザー名フィールドがあります...
行を並べ替える方法はありますか?/etc/shadowこのように、ユーザー名フィールドの順序は、次のユーザー名フィールドの順序と同じです。数値順に並べ替え /etc/パスワード?
sort
並べ替えることができるコマンドなどがありますか?ファイルAこのファイルの特定のキーの後にも並べ替え文書B両方のファイルが共有する共通フィールドにありますか?- または、以下を使用してソートできる適切な2段階のプロセス(コマンド、sed / AWK / Perlスクリプトなど)がありますか?ファイルA再注文文書B共通領域を通過したら?
答え1
ファイルをリンクし、マージされたファイルを並べ替え、不要な列を削除します。
この場合、field1 of は field1 of に/etc/passwd
関連付けられ、フィールド区切り文字として機能します。/etc/shadow
:
join -t : -1 1 -2 1 /etc/passwd /etc/shadow |
sort -t : -k 3,3n |
cut -d : -f 1,8-
答え2
よりエレガントな方法があるかもしれませんが、以下は2段階のアプローチです。
for user in $(sort -n -t: -k3 /etc/passwd | cut -d: -f1)
do
grep ^${user}: /etc/shadow
done > /tmp/shadow.new
/etc/passwd の各項目について、/etc/shadow を一度読みます。
答え3
私のコンピュータで/etc/shadowを読むにはsudoが必要です。
sudo awk -F: 'NR==FNR {uid[$1]=$3; next} {print uid[$1], $0}' /etc/passwd /etc/shadow |
sort -n |
cut -d" " -f2-
awkスクリプトは、シャドウファイルのユーザー名に対応するpasswdファイルのuidをスペースで区切って印刷します。次に、数値でソートし、cutコマンドを使用してuidを削除します。