טיפ יוניקס: פיצול קלט בעזרת הפקודה split

22/04/2023

הפקודה ifconfig (או בגירסתה העדכנית יותר ip a) מציגה רשימה של כל כתובות ה ip על המכונה. זה חלק מהפלט לדוגמה:

utun6: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
        inet6 fe80::4b03:c5a9:d358:bb3a%utun6 prefixlen 64 scopeid 0x17
        nd6 options=201<PERFORMNUD,DAD>
vmenet0: flags=8b63<UP,BROADCAST,SMART,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
        ether be:50:b2:b2:bc:7b
        media: autoselect
        status: active
bridge100: flags=8a63<UP,BROADCAST,SMART,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
        options=3<RXCSUM,TXCSUM>
        ether 52:ed:3c:d3:64:64
        inet 192.168.64.1 netmask 0xffffff00 broadcast 192.168.64.255
        inet6 fe80::50ed:3cff:fed3:6464%bridge100 prefixlen 64 scopeid 0x10
        inet6 fd5e:dcce:7fd0:a7fb:10c8:64d2:15b:ca05 prefixlen 64 autoconf secured
        Configuration:
                id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
                maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
                root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
                ipfilter disabled flags 0x0
        member: vmenet0 flags=3<LEARNING,DISCOVER>
                ifmaxaddr 0 port 15 priority 0 path cost 0
        nd6 options=201<PERFORMNUD,DAD>
        media: autoselect
        status: active

הפקודה split ביוניקס יכולה לעזור לנו לפצל קלט מסוג זה, או קלטים דומים, למספר קבצים ובקלות. בשביל הדוגמה נשים לב שכל "בלוק" מתחיל בשם של ממשק רשת, אחריו נקודותיים ואז כל מיני פרמטרים של אותו ממשק במספר שורות, עד הממשק הבא. אני רוצה לפצל את הטקסט הזה לקבצים כך שנתונים על כל ממשק רשת יישמרו בקובץ נפרד ששמו כשם ממשק הרשת.

תוכן עניינים

  1. פיתרון: הפקודה split

1. פיתרון: הפקודה split

פקודת split של יוניקס היא חלק מ core utils. היא מקבלת קובץ קלט ומייצרת ממנו קבצים אחרים במספור אוטומטי לפי פרמטרי חלוקה שנבחר. היא יכולה לפצל קלט כל n שורות, כל n בתים או במקרה שלנו כל פעם שנתקלים בתבנית מסוימת. השורה הבאה יוצרת קובץ לכל ממשק רשת מ ifconfig:

$ /sbin/ifconfig|split -p '^[a-z]'

הקבצים שנוצרו נקראים xaa, xab, xac וכך הלאה - קובץ לכל התקן רשת. עכשיו נשאר רק להריץ לולאת for פשוטה עדיין מתוך bash כדי להתאים את השמות:

$ for f in x??; do mv $f $(head -1 $f | egrep -o '^[a-z0-9]+'); done

והתוצאה - לכל ממשק רשת מ ifconfig נוצר קובץ ששמו הוא כשם ממשק הרשת, והתוכן הוא כל בלוק המידע מ ifconfig על אותו ממשק.