[ad_1]
Đôi khi trong các tập lệnh Linux, bạn muốn biết liệu một chuỗi văn bản có chứa một chuỗi cụ thể, nhỏ hơn hay không. Có rất nhiều cách để làm điều này. Chúng tôi chỉ cho bạn một số kỹ thuật đơn giản, đáng tin cậy.
Tại sao điều này lại hữu ích?
Tìm kiếm một chuỗi cho một chuỗi con nhỏ hơn là một yêu cầu phổ biến. Một ví dụ sẽ là đọc văn bản từ một tệp hoặc từ đầu vào của con người và tìm kiếm chuỗi cho một chuỗi con cụ thể để tập lệnh của bạn có thể quyết định phải làm gì tiếp theo. Nó có thể đang tìm kiếm nhãn hoặc tên thiết bị trong tệp cấu hình hoặc chuỗi lệnh trong một dòng đầu vào từ người dùng.
Người dùng Linux được may mắn với bất kỳ tiện ích nào để thao tác văn bản. Một số được tích hợp vào Bash shell, một số khác được cung cấp dưới dạng các tiện ích hoặc ứng dụng độc lập. Có một lý do tại sao các hệ điều hành dựa trên Unix được phục vụ phong phú với khả năng thao tác chuỗi.
Một số thứ dường như là tệp không phải là tệp đơn giản. Họ đang các tập tin đặc biệt đại diện cho những thứ như thiết bị phần cứng và nguồn thông tin hệ thống. Tính trừu tượng được thực hiện bởi hệ điều hành cung cấp cho chúng hình thức và đặc điểm của tệp. Bạn có thể đọc thông tin từ chúng — dưới dạng văn bản, một cách tự nhiên — và trong một số trường hợp, ghi vào chúng, nhưng chúng không phải là tệp thông thường.
Văn bản cũng được sử dụng làm đầu vào và đầu ra cho các lệnh trong cửa sổ đầu cuối. Điều này cho phép chuyển hướng và đường ống của đầu vào và đầu ra. Chức năng đó làm nền tảng cho khả năng xâu chuỗi các lệnh Linux lại với nhau, chuyển đầu ra từ một lệnh làm đầu vào cho lệnh tiếp theo.
Bất kể nguồn gốc của nó là gì, việc tìm kiếm văn bản mà chúng ta nhận được để tìm một từ, lệnh, nhãn quan trọng hoặc một số chỉ báo khác là một phần tiêu chuẩn của việc xử lý dữ liệu dựa trên văn bản. Dưới đây là một bộ sưu tập các kỹ thuật đơn giản mà bạn có thể đưa vào các tập lệnh của riêng mình.
Tìm các chuỗi con với nội trang Bash
Dấu ngoặc kép “[[...]]
”Kiểm tra so sánh chuỗi có thể được sử dụng trong if
các câu lệnh để xác định xem một chuỗi có chứa một chuỗi khác hay không.
Sao chép tập lệnh này vào trình chỉnh sửa và lưu vào tệp có tên “double.sh”.
#!/bin/bash if [[ "monkey" = *"key"* ]]; then echo "key is in monkey" else echo "key is not in monkey" fi
Bạn sẽ cần làm cho tập lệnh có thể thực thi được với chmod
yêu cầu. Đây là bước luôn bắt buộc để thực thi bất kỳ tập lệnh nào. Bạn sẽ cần thực hiện việc này mỗi khi tạo tệp tập lệnh. Thay thế tên của tập lệnh thích hợp trong mỗi trường hợp.
chmod +x double.sh
Hãy chạy script.
./double.sh
Điều này hoạt động vì dấu hoa thị ” *
”Đại diện cho bất kỳ chuỗi ký tự nào, kể cả không có ký tự nào. Nếu chuỗi con “khóa” nằm trong chuỗi đích, có hoặc không có bất kỳ ký tự nào phía trước hoặc phía sau nó, thì kiểm tra sẽ trả về true.
Trong ví dụ của chúng tôi, có các ký tự phía trước chuỗi con. Chúng được khớp bởi dấu hoa thị đầu tiên. Không có ký tự nào phía sau chuỗi con nhưng vì dấu hoa thị cũng không khớp với ký tự nào nên bài kiểm tra vẫn vượt qua.
Để linh hoạt, chúng tôi có thể sửa đổi tập lệnh của mình để xử lý các biến thay vì các chuỗi theo nghĩa đen. Đây là tập lệnh “double2.sh.”
#!/bin/bash string="Monkey" substring="key" if [[ $string = *$substring* ]]; then echo "$substring was found in $string" else echo "$substring was not found in $string" fi
Hãy xem nó chạy như thế nào.
./double2.sh
Điều này hoạt động theo cách tương tự, với ưu điểm là chúng ta có thể sử dụng tên biến thay vì chuỗi ký tự. Biến giải pháp nhỏ của chúng tôi thành một chức năng sẽ mang lại sự linh hoạt nhất.
Đây là tập lệnh “double3.sh.”
#!/bin/bash shopt -s nocasematch string="Monkey" substring="Key" capital="London" check_substring () { if [[ $1 = *$2* ]]; then echo "$2 was found in $1" else echo "$2 was not found in $1" fi } check_substring "Monkey" "key" check_substring $string $substring check_substring $string "banana" check_substring "Wales" $capital
Chúng tôi gọi của chúng tôi check_substring
hàm sử dụng kết hợp các biến và chuỗi ký tự. Chúng tôi đã sử dụng shopt
với nó -s
(set) tùy chọn để thiết lập nocasematch
để làm cho các trận đấu không phân biệt chữ hoa chữ thường.
Đây là cách nó chạy.
./double3.sh
Chúng ta có thể sử dụng thủ thuật quấn chuỗi con trong dấu hoa thị trong case
các câu lệnh cũng vậy. Đây là “case.sh.”
#!/bin/bash shopt -s nocasematch string="Wallaby" substring="Wall" case $string in *$substring*) echo "$substring was found in $string" ;; *) echo "Nothing matched: $string" ;; esac
Sử dụng case
thay vì rất dài if
các câu lệnh có thể làm cho các tập lệnh dễ đọc và gỡ lỗi hơn. Nếu bạn cần kiểm tra xem một chuỗi có chứa một trong nhiều chuỗi con có thể xảy ra hay không, thì case
tuyên bố sẽ là sự lựa chọn tốt nhất.
./case.sh
Chuỗi con được tìm thấy.
Tìm chuỗi con với grep
Ngoài các nội trang Bash, công cụ tìm kiếm văn bản đầu tiên bạn có thể tiếp cận là grep
. Chúng ta có thể sử dụng grep
khả năng bẩm sinh của để tìm kiếm một chuỗi trong một chuỗi để tìm kiếm các chuỗi con của chúng ta.
Tập lệnh này được gọi là “subgrep.sh”.
#!/bin/bash string="porridge pot" substring="ridge" if $(echo $string | grep -q $substring); then echo "$substring was found in $string" else echo "$substring was not found in $string" fi
Tập lệnh sử dụng echo
để gửi chuỗi vào grep
, tìm kiếm chuỗi con. Chúng tôi đang sử dụng -q
(yên tĩnh) tùy chọn để dừng lại grep
ghi bất cứ thứ gì vào đầu ra tiêu chuẩn.
Nếu kết quả của các lệnh bên trong dấu ngoặc đơn “(...)
”Bằng 0, có nghĩa là một kết quả phù hợp đã được tìm thấy. Bởi vì số không tương đương với true
trong Bash, if
tuyên bố hài lòng và then
mệnh đề được thực thi.
Hãy xem đầu ra của nó là gì.
./subgrep.sh
Tìm chuỗi con với sed
Chúng ta có thể sử dụng sed
để tìm một chuỗi con.
By default,
sed
prints all text that is fed into it. Usingsed -n
prevents this. The only lines that are printed are matching lines. This expression will print any lines that match or contain the value of $substring."/$substring/p"Chúng tôi cung cấp giá trị của
$string
vào trongsed
sử dụng chuyển hướng tại đây,<<<
. Điều này được sử dụng để chuyển hướng các giá trị thành một lệnh trong trình bao hiện tại. Nó không gọi một vỏ con theo cách mà một đường ống sẽ làm.Người đầu tiên
-n
là bài kiểm tra. Nó sẽ trở lạitrue
nếu đầu ra từsed
lệnh khác 0. Cách duy nhất đầu ra từsed
có thể khác 0 là nếu một dòng phù hợp được tìm thấy. Nếu đúng như vậy,$substring
phải được tìm thấy trong$string
.Đây là “subsed.sh.”
#!/bin/bash string="Sweden" substring="eden" if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then echo "$substring was found in $string" else echo "$substring was not found in $string" fiChúng tôi nhận được phản hồi mong đợi khi chúng tôi chạy tập lệnh.
./subsed.sh
Chúng tôi có thể kiểm tra tính logic của tập lệnh bằng cách chỉnh sửa giá trị của
$substring
để so sánh không thành công../subsed.sh
Ngừng tìm kiếm, đã tìm thấy nó
Các công cụ khác có thể tìm thấy các chuỗi con, chẳng hạn như
awk
vàPerl
nhưng một trường hợp sử dụng đơn giản như tìm một chuỗi con không đảm bảo chức năng bổ sung của chúng cũng như không tăng thêm độ phức tạp. Đặc biệt, việc sử dụng nội trang Bash để tìm kiếm các chuỗi con rất nhanh chóng, đơn giản và không yêu cầu các công cụ bên ngoài.CÓ LIÊN QUAN: Cách sử dụng các câu lệnh trường hợp trong Bash Scripts
[ad_2]