เทอร์มินัลสคริปต์เพื่อค้นหาไฟล์ CSV


2

2 ส่วนนี้ไม่สามารถดูว่าฉันจะผิด

ส่วนที่ 1 ทำงาน - รับ BSSID ของฉันผ่านคำสั่งสนามบิน:

myBSSID="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | grep BSSID | awk '{print $2}'"

(นี่คือที่ที่ฉันได้รับ EOF หรือข้อผิดพลาดทางไวยากรณ์): ส่งค่านั้นไป awk ซึ่งจะค้นหาไฟล์ (APtable.csv) สำหรับสตริงนั้นและให้ค่าที่อยู่ติดกันกับมัน:

awk -v theBSSID=$myBSSID '$1 == theBSSID {print $2}' '/Users/russell/Desktop/APtable.csv'

ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุในท้ายที่สุดคุณสามารถดูการทำเช่นนี้ในหลาม; คำตอบนี้ให้จุดเริ่มต้นและคุณสามารถเก็บ (เข้าถึง) ค่าส่งคืนโดยใช้เช่นpandasโมดูลในหลาม
Asmus

1
ฉันได้อัปเดตคำตอบแล้วดังนั้นคุณอาจต้องการตรวจสอบมัน
user3439894

: (พูดเร็วเกินไป
nuthindoin

ดังนั้นกฎของ Murphy เป็น BSSID แรกที่ฉันเชื่อมต่อด้วยมีค่านำ 0 ดังนั้นสคริปต์ดั้งเดิมจะไม่ส่งคืนสิ่งใดเลย แต่การรันสคริปต์ที่เพิ่มเข้ามาของคุณทำให้ฉันได้รับอะไรบางอย่าง แต่ฉันก็ไม่แน่ใจเหมือนกันว่า:awk: newline in string 94:b4:0f:ed:fd:b1 40... at source line 1
nuthindoin

ดูเหมือนว่า awk ค้นหาสิ่งที่ต้องการในคอลัมน์ 1 ของไฟล์ แต่ไม่พิมพ์คอลัมน์ 2 ถัดจากไฟล์
nuthindoin

คำตอบ:


3

คุณไม่จำเป็นต้องไปป์ไลน์grepและไปยังawkบรรทัดแรกตามที่awkสามารถทำสิ่งที่ต้องการได้ด้วยตัวเอง เช่นเดียวกับที่คุณเขียนบรรทัดแรกมันหายไปโดย$(...)รอบคำสั่ง

ในบรรทัดที่สองคุณไม่มีตัวคั่นฟิลด์ในawkคำสั่งซึ่ง.csvโดยปกติในไฟล์จะเป็นเครื่องหมายจุลภาค ดังนั้นฉันเพิ่มที่awkคำสั่ง

ใช้สองบรรทัดต่อไปนี้:

myBSSID="$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | awk '/BSSID/{print $2}')"
awk -F ',' -v theBSSID="$myBSSID" '$1 == theBSSID {print $2}' "$HOME/Desktop/APtable.csv"

ฉันสังเกตเห็นผลลัพธ์ของairportคำสั่งไม่ได้รายงานBSSIDอย่างถูกต้องว่าถ้าปล่อยออกจากศูนย์

หากเป็นเช่นนั้นในระบบของคุณและ.cvsไฟล์มีข้อมูลที่ถูกต้องให้ลองทำดังนี้:

myBSSID="$(system_profiler SPAirPortDataType | awk '/BSSID/{print $2}')"
awk -F ',' -v theBSSID="$myBSSID" '$1 == theBSSID {print $2}' "$HOME/Desktop/APtable.csv"

โปรดทราบว่าการใช้system_profiler SPAirPortDataTypeไม่เร็วเท่านี้airportแต่ถ้าผลลัพธ์ของการairportปล่อยค่าศูนย์บางส่วนคุณจะต้องใช้ตัวเลือกอื่นหากไฟล์BSSIDในนั้น.cvsมีอักขระทั้งหมด 12 ตัวไม่นับโคลอนซึ่งควรจะเป็น

ข้อมูลต่อไปนี้สามารถใช้เพื่อรวมทั้งสองวิธีในbash สคริปต์เพื่อใช้เฉพาะวิธีที่สองหากความยาวmyBSSIDน้อยกว่า 17 ตัวอักษรเนื่องจาก 17 เป็นความยาวที่ถูกต้อง

#!/bin/bash

myBSSID="$(/S*/L*/P*/A*/V*/A/R*/airport -I | awk '/BSSID/{print $2}')"
l="${#myBSSID}"
if [[ $l -lt 17 ]]; then
    myBSSID="$(system_profiler SPAirPortDataType | awk '/BSSID/{print $2}')"
fi
awk -F ',' -v theBSSID="$myBSSID" '$1 == theBSSID {print $2}' "$HOME/Desktop/APtable.csv"

343 - ฉันได้สังเกตเห็นเช่นกัน (ลดลง 0) ... แปลก เราสามารถเป็นคนแรกที่สังเกตเห็นสิ่งนี้ได้หรือไม่? แต่สิ่งสำคัญคือคุณได้รับรหัสเพื่อทำงาน (ร่วมกัน)! ขอบคุณ
nuthindoin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.