Câu hỏi Nhận một từ cụ thể bằng cách sử dụng awk


Tôi đang mã hóa một kịch bản lệnh để kiểm tra cơ sở dữ liệu mysql bằng cách sử dụng tập lệnh bash, tôi muốn kiểm tra xem trạng thái của bảng không phải là 'OK', sẽ trả về tên bảng và thực hiện một số hành động khác:

check.log

table1                 OK
table2                 Some error here
table3                 OK
table4                 OK
table5                 Another error
table6                 OK
table7                 Broken
table8                 A very long error which take a 2 lines
of multiple errors

check.sh

# check and repair tables
mysqlcheck -u $hostUser -p$hostPasswd --all-databases --check --auto-repair >> check.log

# grep tables status, should return OK
cat check.log | grep 'OK' | awk '{print $2}'| while read status; do

# if any table does not contain OK
if [ "$status" != "OK" ]
then
##### HERE WHERE I am stuck
#### It loops and return all the table

# grep to get the table name
cat check.log | grep 'OK' | awk '{print $1}'| while read table; do
echo $tblName' is BROKEN'
done
else
echo $tblName' is FINE'
fi

done

// here I need to mail the tables that have problems in one single mail

Tìm kiếm một đầu ra như:

tableName: error
tableName: error

table2: Some error here
table5: Another error
and so on

Những dòng này sẽ là đầu ra thành tệp nhật ký (result.txt)

Cảm ơn sự hỗ trợ của bạn


1
2018-03-30 01:33


gốc


Bạn có lý do cụ thể để sử dụng không awk? - Jacob Vlijm
Vâng, nếu có một phương pháp tốt hơn, tại sao không - Abu Rayane


Các câu trả lời:


Bạn không cần phải đọc tập tin từng dòng bằng cách sử dụng bash. Awk đã làm điều đó rồi. Ví dụ: bạn có thể in các mục bị hỏng bằng mã này

awk '$2!="OK"{print $0}'  check.log

Bạn cũng có thể chỉ cần in tên bảng và sử dụng lệnh đó để tạo một mảng, sau đó hành động dựa trên các mảng đó:

array=( $(awk '$2!="OK"{printf "%s ",$1 }'  check.log) )

Lưu ý không gian bên cạnh %s, đó là quan trọng.

Bạn cũng đã đề cập, lỗi đó có thể là nhiều dòng, giống như bảng 8. Có lẽ chúng ta muốn tránh làm rối tung điều đó. Vì vậy, chúng tôi có thể thêm một kiểm tra cũng cho lĩnh vực 1 để chứa một bảng từ.

$> array=( $(awk '$1~/table/ && $2!="OK"{printf "%s ",$1 }'  check.log) )      
$> echo ${array[@]}                                                            
table2 table5 table7 table8
$> echo ${array[0]}                                                            
table2

5
2018-03-30 02:34



Oh yeah, tuyệt vời, làm thế nào tôi có thể in nội dung của mảng? - Abu Rayane
Hoặc echo hoặc printf sẽ làm. Xem chỉnh sửa của tôi - Sergiy Kolodyazhnyy
Bàn có thể có các tên khác nhau, tôi đang tìm kiếm kết quả như đã đề cập ở trên trong câu hỏi đã chỉnh sửa của mình - Abu Rayane
@AbuRayane đó là nó? Bạn chỉ muốn các dòng như tableX Error#25 ? - Sergiy Kolodyazhnyy
Trong trường hợp đó , awk '$2!="OK"{print $0}' check.log, mã đầu tiên của tôi là những gì bạn muốn. - Sergiy Kolodyazhnyy


awkhành vi mặc định của bạn là in dòng đầy đủ khi một điều kiện True xảy ra, bạn có thể nói một cái gì đó đơn giản như thế này:

awk '$NF != "OK"' file

Mà trả về sau cho đầu vào cho trước của bạn:

table2                 Some error here
table5                 Another error
table7                 Broken
table8                 A very long error which take a 2 lines
of multiple errors

Giải trình

  • NF viết tắt của số trường, vì vậy $NF viết tắt của số trường NF. Đó là, trường cuối cùng trên mỗi dòng.
  • Nói $NF != "OK" chúng tôi đang kiểm tra xem trường cuối cùng trên dòng là "OKNếu không, điều kiện là đúng và dòng được in tự động.

3
2018-03-30 07:00



Đó là một thổi còi tốt, tôi đang tìm cách in kết quả mỗi hàng, như tôi đã chỉnh sửa trong câu hỏi của tôi ở trên, xem phần "Tìm kiếm đầu ra như:" - Abu Rayane
@AbuRayane bạn nên chỉnh sửa câu hỏi của mình để hiển thị kết quả chính xác nào bạn muốn. Hiện tại nó không rõ ràng. - fedorqui
Các giải pháp mà bạn cung cấp và Serg cũng cho tôi, là chính xác, nó chỉ là vấn đề hiển thị, tôi cần hiển thị dòng kết quả theo dòng, tức là: table2: error thì new line table3: error new new table5 : lỗi và như vậy - Abu Rayane
@AbuRayane vì vậy thay vì lỗi đầy đủ bạn chỉ muốn hiển thị chuỗi "lỗi"? - fedorqui
Không, lỗi đầy đủ, nhưng hiển thị từng dòng như đã đề cập ở trên - Abu Rayane