聞いたことがあるので、この問題にツールが存在することは知っていますが、それらが何であるかはわかりません。
/ etc/passwd内のユーザー名以外のすべてのデータをフィルターで除外するようなことをしたいと思います。
たとえば、次のファイルからuser1、user2、user3を取得したいとします。この場合、ロジックは「ファイルの各行の最初の「:」までテキストを取得する」である可能性があります。
user1:x:1:4
user2:x:2:5
user3:x:3:6
出力は次のようになります。
user1
user2
user3
cut
は、まさにこの目的のために存在します。 -d
フラグは区切り文字を指定し、-f
は出力するフィールドを指定します。
cut -d: -f1 /etc/passwd
-f
の引数は、最初と3番目のフィールドを表示する場合は1,3
、最初の3つを表示する場合は1-3
のようになります。フィールドの代わりにバイトと文字を読み取るための-b
フラグと-c
フラグもあります。より柔軟なものが必要な場合は、通常、awk
でうまくいきます( マシューの答え を参照)
表形式の入力からデータを抽出するたびに、 awk を考慮する必要があります。事実上すべてのUnixシステムで利用できるので、次のことを行うことをお勧めします。
awk -F':' '{print $1}' /etc/passwd
-F':'
:「:」を列区切り文字として定義します。'{}'
:この命令を各行に対して実行します。print $1
:最初の列を画面に出力します。これがPerlのワンライナーです:
Perl -F/:/ -lane 'print $F[0]' /etc/passwd
Perlとawkの下には、そのようなジョブ用の3番目のツールがあります。これはsedです。
sed 's/:.*//' FILE
これは置換コマンドです。コロンから置換:の後にドットが続きます。これは、任意の種類、任意のカウント(*)の文字のジョーカーであり、何もありません。
これは 's(ubstitute)/ FROM/TO /'であり、TOは空です。つまり、 '最初の(sedはデフォルトで貪欲であるため)コロンからすべてを削除します(sedは行全体で適切に機能するため、行末まで)。
もちろん、cut
もすばらしいコマンドですが、別の家族からだと思います。
あなたの例では、3つの名前はすべて同じ長さです。このような場合(これは発生する可能性がありますが、/ etc/passwdではそれほど発生しない可能性があります)、colrmも使用できます。
echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3
または、もちろん
cat FILE | colrm 6
(useless use of cat
は適用されません。これは、パラメータとして機能するFILEを手動でcolrmすることができないためです。)
完全を期すために、外部コマンドは必要ありません。シェル(Bourne Shellまたは互換性のあるもの)はそれを単独で処理できます。
while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file
もちろん、これはおそらくすべての可能な解決策の中で最も遅いので、巨大なファイルの場合は別のものを選択してください。