답장: grep 명령.
우리 학교의 Linux 시스템에 있는 모든 학생의 이름을 파일에서 검색해야 합니다. 나는 이것을 할 수 있었고 약 665개의 이름을 반환할 수 있었습니다. (파일의 첫 번째 문자열 /etc/passwd
).
여기에서 이름이 "o"로 끝나는 학생과 이름에 "o"가 두 개 이상 포함된 학생을 정렬해야 합니다.
이것은 사실 나를 위한 것이 아닙니다. 정말 숙제이지만 친구를 위한 것입니다.
숙제할 나이는 지났어요 :)
그는 결과를 얻으려면 grep을 사용해야 했습니다.
저는 몇 년 동안 grep을 사용하지 않았습니다. 한동안 grep을 가지고 놀았지만 이를 달성하기 위해 다른 명령을 사용하는 것을 피할 수 없었습니다. 커뮤니티의 누군가가 grep을 사용하여 이 작업을 수행하는 방법을 알고 있는지 궁금합니다.
/etc/passwd
문자 'o'로 끝나는 파일 이름의 경우:
grep -Eo '^[a-zA-Z0-9._-]+' /etc/passwd | grep -Eo 'o$'
이 방법은 작동하지만 전체 이름은 표시하지 않고 파일의 요청과 일치하는 단일 항목에 대해 "o" 문자만 표시합니다.
확실하지 않다:
1) 출력, 즉 전체 이름을 표시하는 방법은 무엇입니까? 2) 이름에 "o"가 여러 개 포함된 이름을 검색하는 방법은 무엇입니까?
예를 들어 /etc/passwd
파일에서... 문자 "o"로 끝나는 하나의 파일에 모든 사용자의 출력을 표시하고 싶습니다. 문자 "o"가 두 개 이상 포함된 다른 파일에 모든 사용자를 표시하고 싶습니다.
답변1
아직도 당신이 무엇을 하려는지 완전히 확신할 수 없지만 이것이 도움이 될 것입니다.
여러 개를 포함하는 이름 가져오기 o
:
$ awk -F':' '$1~/.*o.*o/{print $1}' /etc/passwd
root
nobody
colord
foo
또는
cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*'
또는 grep
(이 경우에는 어리석은 일입니다) sed
후행 콜론을 사용하고 제거하십시오.
grep -oP '^.*?:' /etc/passwd |grep '.*o.*o.*' | sed 's/://'
정말로 단독으로 사용해야 한다면 grep
다음을 시도해 보십시오:
grep -oP '^.*?:' /etc/passwd |grep '.*o.*o.*' | grep -o '[^:]*'
o
여러 개를 포함하고 다음으로 끝나는 이름을 가져옵니다 o
.
awk -F':' '$1~/.*o.*o/{print $1}' /etc/passwd | grep 'o$'
또는
cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' | grep 'o$'
순수 grep:
grep -oP '^.*?:' /etc/passwd |grep '.*o.*o.*' | grep -o '[^:]*' | grep 'o$'
출력을 다른 파일에 저장
cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' > two_os.txt
cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' > last_o.txt
답변2
제 생각에는 "o"로 끝나거나 "oo"를 포함한다는 뜻인 것 같아요.
cut -d: -f1 /etc/passwd | grep -E "oo|o$" |sort
그러나 grep 대신 grep을 사용해야 한다면 -E
,
(cut -d: -f1 /etc/passwd | grep "oo"; cut -d: -f1 /etc/passwd | grep "o$" /tmp/names) |sort |uniq
펄에서는
#!/bin/env perl
use strict;
use warnings;
open(my $fh,"< /etc/passwd") || die "cannot open passwd";
while(my $line=<$fh>) {
my @cols = split(/:/,$line);
if( $cols[0] =~ /oo/ || $cols[0] =~ /o$/ ) { print "$cols[0]\n"; }
}