• בלוג
  • שתי דרכים טובות ואחת לא ממש כדי להדפיס אורך שורה ביוניקס

שתי דרכים טובות ואחת לא ממש כדי להדפיס אורך שורה ביוניקס

17/11/2022

יש לכם תוכנית שמייצרת פלט ואתם צריכים לגלות מה האורך של כל שורה בפלט ולהדפיס את האורך לפני השורה עצמה. איך עושים את זה? הנה שלושה רעיונות:

1. הפשוט: awk

הכלי הראשון שקופץ לראש הוא awk, שלמרות שהוא יודע ואוהב לחתוך את השורה למילים, אפשר להשתמש בו גם בשביל לבצע פעולות על השורה המלאה. הפקודה תהיה:

ls -l | awk '{print length($0) " " $0 }'

2. הקריפטי: perl

אחרי שכתבתי את זה ב awk ניסיתי למצוא עוד כלים שתומכים בתחביר דומה. מאוד רציתי את sed אבל לא מצאתי איך לחשב שם את אורך השורה. פרל היתה הבחירה הבאה:

ls -l | perl -nl -e 'print(length($_) . " $_")'

זה קצת יותר ארוך מה awk אבל עובד ומאפשר יותר גמישות אם בעתיד נצטרך.

ואלה מכם שמחפשים כלי יותר מודרני יכולים תמיד להחליף את ה perl ב ruby:

ls -l | ruby -nl -e 'puts "#{$_.length} #{$_}"'

3. המסובך עם הטעות: xargs

הכיוון האחרון והמסובך ביותר היה להשתמש ב xargs כדי לשבור את הפלט לשורות, ואז להפעיל wc על כל שורה. זה נראה ככה:

ls -l | xargs -I % sh -c 'echo $(echo -n "%" | wc -c) "%"'

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

הלקח מכל הסיפור? כשיש דרך פשוטה לפתור בעיה עדיף לבחור בה. סיכוי טוב שהיא גם תהיה יותר נכונה.