デフォルトでは、約90のユーザー名を含むファイルがあります。
私は合計300行のpasswdファイルからこれらのユーザー名をすべて削除する必要がありました。
少なくとも重複したユーザー名をフィルタリングして維持する必要があるユーザー名を印刷する方法を見つけようとしましたが、成功しませんでした。
削除したい90個のユーザー名を含むファイルに次のものが含まれているとします。
ファイル.txt
user1
user2
user3
user4
passwd ファイルには、これらのユーザー名やその他の情報が含まれています。
パスワード
user31
user32
user1
user23
user2
user4
user15
user3
passwdファイルのユーザー名はファイル内でランダムに配布されるため、diff -y
これは行われません。
私の目標は、cat file.txtという2つのファイルを比較し、出力を使用してpasswd内で検索することです。結果は、重複した行を削除するか、独自の行を印刷することです。
答え1
このcomm
コマンドは、2つのソートされたファイルを比較および照合するために使用できます。
comm <(sort file.txt) <(cut -d: -f1 /etc/passwd | sort)
- 最初の列には、2番目のファイルには表示されない最初のファイルの行が含まれています。
- 2番目の列には、最初のファイルには表示されない2番目のファイルの行が含まれています。
- 3番目の列には、両方のファイルに表示される行が含まれています。
3列出力から1つまたは2つの列を省略できます(comm -13 ...
たとえば、列1と3は省略されます)。
あなたの質問には尋ねませんでしたが、後続のコマンドからユーザー名のリストを取得し、そのアイテムを抽出する方法を要求しました/etc/passwd
。
( echo root; echo sys ) | sed -r 's!(.*)!^\1:!' | grep -f - /etc/passwd
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/usr/sbin/nologin
答え2
最も簡単な方法は次のとおりです。
grep -v -x -f file_infotodelete reference_file > result_file
答え3
これを達成するには、以下のawk onelinerを使用してください。
次のコマンドは、passwd ファイルから file.txt の内容を削除します。テストしてみましたが、とてもうまくいきました。
awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' file.txt passwd