หากชื่อไฟล์ของคุณไม่มีบรรทัดใหม่คุณสามารถหลีกเลี่ยงการเรียกใช้หลายรายการgrep
โดยให้ grep พิมพ์ชื่อของไฟล์ที่ตรงกันและนับผลลัพธ์
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
"${#matches[@]}"
จำนวนของการแข่งขันคือ
อาจมีวิธีใช้grep --null -lw
ที่นี่ แต่ฉันไม่แน่ใจว่าจะแยกวิเคราะห์ผลลัพธ์ได้อย่างไร ทุบตีvar=( array elements )
ไม่ได้มีวิธีการใช้ที่คั่นแทน\0
\n
บางทีmapfile
builtin ของ bash สามารถทำได้หรือไม่ -d string
แต่อาจจะไม่ได้เพราะคุณระบุตัวคั่นด้วย
คุณสามารถทำได้count=$(grep -l | wc -l)
แต่จากนั้นคุณมีกระบวนการภายนอกสองกระบวนการดังนั้นคุณอาจทำงานgrep
บนสองไฟล์แยกกัน (ความแตกต่างระหว่างgrep
กับwc
ค่าใช้จ่ายในการเริ่มต้นมีขนาดเล็กเมื่อเทียบกับ fork + exec + dynamic linker stuff เพื่อเริ่มกระบวนการแยกต่างหากเลย)
นอกจากนี้ยังมีwc -l
คุณไม่พบออกซึ่งไฟล์จับคู่
ด้วยผลลัพธ์ที่ได้จากอาเรย์นั้นอาจเป็นสิ่งที่คุณต้องการอยู่แล้วหรือหากมีการจับคู่ที่ตรงกันทั้งหมด 1 รายการคุณสามารถตรวจสอบว่าเป็นอินพุทแรกหรือไม่
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
เป็นที่จดชวเลขสำหรับ${matches[0]}
องค์ประกอบอาร์เรย์แรก