最長のユーザー名を印刷してください。

最長のユーザー名を印刷してください。

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がユーザー名に置き換えられます。たとえば、次の項目があるとします。fingersendmailpasswd

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削除して最長の名前を選択してください。sorthead

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

ユーザー名、xUID、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

関連情報