ฉันต้องการส่งออกข้อมูลจากเซิร์ฟเวอร์ zimbra แต่ส่งออกข้อมูลในทุกบรรทัดใหม่ คำสั่งของฉัน:
zmprov -l gaa -v domain.com | grep -e "zimbraForeignPrincipal: " -e "zimbraTwoFactorAuthEnabled: " -e "^mail: "

แต่ผลลัพธ์ดูเหมือนว่า:
email:
zimbraForeignPrincipal:
zimbraTwoFactorAuthEnabled
มีวิธีใดบ้างที่จะมีอีเมลที่มีแอตทริบิวต์ที่เกี่ยวข้องในบรรทัดเดียวหรือไม่

answer

ใช้ awk:

zmprov -l gaa -v domain.com | \
grep -e "zimbraForeignPrincipal: " -e "zimbraTwoFactorAuthEnabled: " -e "^mail: " |\
awk '{delim=(NR%2?"\n":" ");txt=(NR==1?"":txt delim) $0}END{print txt}'

มันทำสิ่งต่อไปนี้:

  1. ตั้งค่าตัวคั่นตามหมายเลขบรรทัดปัจจุบัน: หากเป็นเลขคี่ ตัวคั่นก็คือการขึ้นบรรทัดใหม่ หากเป็นเลขคู่ ตัวคั่นคือการเว้นวรรค (นี่คือdelim=(NR%2?"\n":" ")ส่วนหนึ่ง)
  2. รวบรวมบรรทัดทั้งหมดลงในตัวแปรชื่อtxt. แต่ละบรรทัดจะถูกนำหน้าด้วยตัวแปร (เช่น แถวที่รวบรวมมาจนถึงตอนนี้) และตัวคั่นจากจุดก่อนหน้า ยกเว้นว่านี่เป็นบรรทัดแรก ในกรณีนี้ สตริงว่างจะถูกเติมไว้ข้างหน้าแทน ( txt=(NR==1?"":txt delim) $0ส่วน)
  3. ในที่สุด ตัวแปรtxtจะถูกพิมพ์ออกมา