Nếu tên tệp của bạn không chứa dòng mới, bạn có thể tránh được nhiều yêu cầu grep
bằng cách grep in tên của các tệp phù hợp và đếm kết quả.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Số lượng các trận đấu là "${#matches[@]}"
.
Có thể có một cách để sử dụng grep --null -lw
ở đây, nhưng tôi không chắc cách phân tích đầu ra . Bash var=( array elements )
không có cách sử dụng một \0
dấu phân cách thay vì \n
. Có lẽ mapfile
nội dung của bash có thể làm điều đó? Nhưng có lẽ là không, bởi vì bạn chỉ định dấu phân cách với -d string
.
Bạn có thể count=$(grep -l | wc -l)
, nhưng sau đó bạn có hai quy trình bên ngoài để bạn có thể chỉ chạy riêng grep
trên hai tệp. (Sự khác biệt giữa chi phí khởi động grep
so với wc
chi phí khởi động là nhỏ so với fork + exec + công cụ liên kết động để bắt đầu một quy trình riêng biệt).
Ngoài ra, với wc -l
bạn không tìm hiểu mà tập tin phù hợp.
Với kết quả thu được trong một mảng, đó có thể là những gì bạn muốn hoặc nếu có chính xác 1 kết quả khớp, bạn có thể kiểm tra xem đó có phải là đầu vào đầu tiên hay không.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
# print the matching filenames
[[ -n $matches ]] && printf 'match in %s\n' "${matches[@]}"
# figure out which input position the name came from, if there's exactly 1.
if [[ "${#matches[@]" -eq 1 ]]; then
if [[ $matches == "$file1" ]];then
echo "match in file1"
else
echo "match in file2"
fi
fi
$matches
là tốc ký cho ${matches[0]}
, phần tử mảng đầu tiên.