web-dev-qa-db-ja.com

ファイルの特定の内容を取得します

聞いたことがあるので、この問題にツールが存在することは知っていますが、それらが何であるかはわかりません。

/ etc/passwd内のユーザー名以外のすべてのデータをフィルターで除外するようなことをしたいと思います。

たとえば、次のファイルからuser1、user2、user3を取得したいとします。この場合、ロジックは「ファイルの各行の最初の「:」までテキストを取得する」である可能性があります。

user1:x:1:4
user2:x:2:5
user3:x:3:6

出力は次のようになります。

user1
user2
user3
9
mouche

cutは、まさにこの目的のために存在します。 -dフラグは区切り文字を指定し、-fは出力するフィールドを指定します。

cut -d: -f1 /etc/passwd

-fの引数は、最初と3番目のフィールドを表示する場合は1,3、最初の3つを表示する場合は1-3のようになります。フィールドの代わりにバイトと文字を読み取るための-bフラグと-cフラグもあります。より柔軟なものが必要な場合は、通常、awkでうまくいきます( マシューの答え を参照)

19
Michael Mrozek

表形式の入力からデータを抽出するたびに、 awk を考慮する必要があります。事実上すべてのUnixシステムで利用できるので、次のことを行うことをお勧めします。

awk -F':' '{print $1}' /etc/passwd 
  • -F':':「:」を列区切り文字として定義します。
  • '{}':この命令を各行に対して実行します。
  • print $1:最初の列を画面に出力します。
13

これがPerlのワンライナーです:

Perl -F/:/ -lane 'print $F[0]' /etc/passwd
3
Zaid

Perlとawkの下には、そのようなジョブ用の3番目のツールがあります。これはsedです。

sed 's/:.*//' FILE 

これは置換コマンドです。コロンから置換:の後にドットが続きます。これは、任意の種類、任意のカウント(*)の文字のジョーカーであり、何もありません。

これは 's(ubstitute)/ FROM/TO /'であり、TOは空です。つまり、 '最初の(sedはデフォルトで貪欲であるため)コロンからすべてを削除します(sedは行全体で適切に機能するため、行末まで)。

もちろん、cutもすばらしいコマンドですが、別の家族からだと思います。

1
user unknown

あなたの例では、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することができないためです。)

1
user unknown

完全を期すために、外部コマンドは必要ありません。シェル(Bourne Shellまたは互換性のあるもの)はそれを単独で処理できます。

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

もちろん、これはおそらくすべての可能な解決策の中で最も遅いので、巨大なファイルの場合は別のものを選択してください。

1
manatwork