אנדרואיד

כיצד לקרוא קובץ שורה אחר שורה בבאש

תוכן עניינים:

Anonim

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

במדריך זה נדון כיצד לקרוא קובץ שורה אחר שורה בבאש.

קריאת קובץ תחביר שורה אחר שורה

התחביר הכללי ביותר לקריאת קובץ שורה אחר שורה הוא כדלקמן:

while IFS= read -r line do echo "$line" done < input_file

או גרסת השורה היחידה המקבילה:

while IFS= read -r line; do echo $line; done < input_file

איך זה עובד?

קובץ הקלט ( input_file ) הוא שם הקובץ שברצונך להיות פתוח לקריאה על ידי פקודת read . פקודת read קוראת את הקובץ שורה אחר שורה, ומקצה כל line למשתנה line . לאחר עיבוד כל השורות, לולאת הזמן תסתיים. מפריד השדות הפנימיים ( IFS ) מוגדר למחרוזת null לשמירת מרחב לבן מוביל ונגרר שזו התנהגות ברירת המחדל של הפקודה read .

קריאת קובץ לדוגמה שורה אחר שורה

בואו נסתכל על הדוגמא הבאה. נניח, יש לנו קובץ בשם distros.txt המכיל רשימה של כמה distros.txt לינוקס הפופולריות ביותר ומנהלי החבילות שלהם מופרדים באמצעות פסיק ( , ):

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

כדי לקרוא את הקובץ שורה אחר שורה תריץ את הקוד הבא בטרמינל שלך:

while IFS= read -r line do echo "$line" done < distros.txt

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

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

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

כשקוראים קובץ שורה אחר שורה, תוכלו גם להעביר יותר ממשתנים אחד לפקודת הקריאה אשר תחלק את השורה לשדות על בסיס ה- IFS . השדה הראשון מוקצה למשתנה הראשון, השני למשתנה השני וכן הלאה. אם ישנם יותר שדות מאשר משתנים, שדות השאריות מוקצים למשתנה האחרון.

בדוגמה הבאה אנו מגדירים את IFS לפסיק ( , ) ומעבירים שני משתנים distro ו- pm לפקודת הקריאה. הכל מתחילת השורה ועד לפסיק הראשון יוקצה למשתנה הראשון ( distro ) ושאר הקו יוקצה למשתנה השני ( pm ):

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

שיטות קריאה חלופיות לקבצים

באמצעות החלפת תהליכים

החלפת תהליכים מאפשרת לך להעביר פלט מהפקודה כשם קובץ:

while IFS= read -r line do echo "$line" done < <(cat input_file)

באמצעות מחרוזת כאן

Here String הוא גרסה של מסמך Here. המחרוזת (cat input_file) תשמור על (cat input_file) החדשים:

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

באמצעות מתאר קבצים

אתה יכול גם לספק את הקלט ללולאה באמצעות מתאר קבצים:

while IFS= read -r -u9 line do echo "$line" done 9< input_file

בעבודה עם מתאר קבצים השתמש במספר שבין 4 ל 9 כדי למנוע התנגשות עם מתאר קבצים פנימיים.

סיכום

באש, אנו יכולים לקרוא קובץ שורה אחר שורה על ידי מתן שם הקובץ כקלט לולאת קריאה בזמן.

מסוף bash