검색할 문자열이 23개 있는데 해당 문자열을 파일에 반환하고 싶습니다.
다음 코드를 얻었습니다.
users='User1\|User2\|User3\|User4\|User5\|User6\|User7\|User8\|User9\|User10\|User11\|User12..User23'
원하는 출력:
User1 is in the file
User2 is not in the file
...
User 23 is in the file
어떻게 해야할지 모르겠습니다. 배열을 생각하고 있지만 가능하다면 몇 가지 팁을 얻고 싶습니다. 미리 감사드립니다.
답변1
배열을 사용하십시오:
users=(User1 User2 User3 User4) # et cetera
for i in "${users[@]}"; do
echo -n "$user is "
if grep -q "$user" inputfile; then
echo "present"
else
echo "not present"
fi
done
grep -q
검색이 수행되지만 출력이 반환되지 않으므로 if
테스트에서 자동으로 사용할 수 있습니다.
또는 각 사용자를 이름이 지정된 파일에 넣은 Users
후 다음을 수행할 수 있습니다.
grep -o -f Users inputfile
그러면 본 모든 사용자의 목록이 출력됩니다. 현재 사용자와 부재 사용자를 보려면 다음을 수행하세요.
echo "Users present:"
grep -o -f Users inputfile
echo "Users absent:"
grep -vo -f Users inputfile
답변2
이 시도,
users=( User1 User2 User3 User4 )
for i in "${users[@]}"
do
grep -qw $i file && echo "$i is in the file" || echo "$i is not in the file"
done
에서 man
:
-q, --조용함, --무음
조용합니다. 표준 출력에 아무 것도 쓰지 마십시오. 일치하는 항목이 발견되면 오류가 감지되더라도 상태 0으로 즉시 종료됩니다.
답변3
추가 조정.
users=( User1 User2 User3 User4 )
for i in "${users[@]}"
do
echo "$i is" $(grep -qw $i file || echo "not") "in the file"
done
답변4
파일을 스캔해 보세요. 이것은 bash입니다.
# the array of user names
users=( User{1..23} )
# an array of grep options: ( -e User1 -e User2 ...)
for u in "${users[@]}"; do grep_opts+=( -e "$u" ); done
# scan the input file and save the user names that are present in the file
readarray -t users_present < <(grep -Fo "${grep_opts[@]}" input | sort -u)
# find the user names absent from the file
# this assumes there are no spaces in any of the user names.
for u in "${users[@]}"; do
[[ " ${users_present[*]} " == *" $u "* ]] || users_absent+=( "$u" )
done
# and print out the results
printf "%s is in the file\n" "${users_present[@]}"
printf "%s is NOT in the file\n" "${users_absent[@]}"