Linuxでユーザー名の最も長い名前を印刷する方法があるかどうかを知りたいです。できますか?
答え1
最長のユーザー名(および長さ)を取得するには:
$ getent passwd | awk -F':' '{ print length($1), $1 }' | sort -rn | head -n 1
11 _traceroute
つまり、passwd
ファイルをインポートして各ユーザー名の長さ(最初の:
区切り文字列)を計算し、長さでソートしてから最初の項目を選択します。
同じ長さのユーザー名が複数ある場合は、アルファベット順に最後のユーザー名が選択されます。
最長の本名を取得するには(そして本名が何であるか、どのくらい長いかを確認するには):
$ getent passwd | awk -F':' '{ print length($5), $1, $5 }' | sort -rn | head -n 1
32 _rtadvd IPv6 Router Advertisement Daemon
:
これは最初のコマンドと同じことを行いますが、ファイル内の5番目に区切られた文字列の長さを計算しますpasswd
。このフィールドにはユーザーの実際の名前が含まれます。出力は、実名、ユーザー名、実名の長さです。
一部のシステムでは、&
特定のツール(または)を介してフィールドにアクセスすると、ユーザーの実際の名前のaがユーザー名に置き換えられます。たとえば、次の項目があるとします。finger
sendmail
passwd
operator:*:2:5:System &:/operator:/sbin/nologin
実名の長さを計算するときは、次の点を考慮してください。
getent passwd | awk -F':' '{ gsub("&", $1, $5); print length($5), $1, $5 }' | sort -rn | head -n 1
そして、以下をawk
削除して最長の名前を選択してください。sort
head
getent passwd |
awk -F':' '
{ gsub("&", $1, $5) ; len = length($5) }
len > max { line = $0 ; max = len; }
END { split(line, a, FS); print max, a[1], a[5] }'
このコードを通して、初めて発見同じ長さの名前が複数ある場合は、最も長い名前が選択されます。
答え2
これはかなり最適化されていませんが、遅いデータベースには通常数万人のユーザーがいないため、可能性があります。
getent passwd | cut -d: -f1 \
| grep $(getent passwd | cut -d: -f1 | tr '[:print:]' '.' | sort | tail -n1)
この内容を少し解いてみましょう。getent passwd
ユーザーデータベースが一覧表示されます。行の形式は次のとおりです。
root:x:0:0:root:/root:/bin/bash
ユーザー名、x
UID、GID、GECOS(最近では一般的に人間が読めるユーザー名)、ホームディレクトリ、シェル。通常、最初の区切りフィールド(ユーザー名など)を除くすべての項目をcut -d:1 -f1
削除します。:
全体的にこれを2回行います。一度は最長のユーザー名の長さ(行2)を探し、それから実際にその長さのユーザー名を見つけます。
最も長いユーザー名の長さを見つけるには、tr
すべての文字を.
sに置き換えます。その後、単にリストをソートし、.
sの最も長い文字列が最後の文字列であることがわかるので、次のようにしてtail -n1
取得できます。 (技術的には、常に少なくとも1人のユーザーが必要ですが、rootユーザーである必要があるため、かなり安全な仮定です。)
これで、最も長いユーザー名と同じくらい長い文字列ができました。幸いなことに、正規表現.
では「すべての文字」のワイルドカードなので、ポイントです。したがって、これを使用して、grep
すべてのユーザー名を対応する空白文字列と一致させ、最長文字のみを一致させます。
(FWIW、私のCentOSコンピュータではですsystemd-network
。)
人が読むことができる名前が必要な場合は、基本的にcut -d: -f5
その逆をしたいと思います。
答え3
ユーザーの名前、姓、電子メールアドレスを含むファイルがあります。以下は、最も長い名前を印刷する方法です。
awk '{print length($1), $1}' filename | sort -nr | head -1| cut -d\ -f2
好きなように調整してみてください。次にスペースの2つのスペースを押したことに注意してください。-d\
利用可能な最長のユーザー名を印刷するには
grep -v "^#" /etc/passwd | awk -F: '{print length($1), $1}' | sort -nr | head -1 | cut -d\ -f2
実際のユーザー名を印刷するには、次のようにします。
grep -v "^#" /etc/passwd | awk -F: '{print length($5), $5}' | sort -nr | head -1 | cut -d\ -f2-
-f2
ユーザーの実際の名前にスペースが含まれるように末尾にダッシュを追加できます。
答え4
以下は、システムユーザーを除いて最長のユーザー名10個です。
sed -n '/sbin/!p' /etc/passwd| awk -F ":" '{print length($1),$1}'| sort -k1 -nr| head
出力
9 praveen10
9 lost_foud
8 p2_final
7 praveen
6 p1_new
5 user5
5 user4
5 user3
5 user2
5 user1