עבור לתוכן

עזרה בשאלה פשוט ב- bash (grep)

Featured Replies

פורסם

שלום כולם,

נתונים הקבצים הבאים בתיקיה:

7b 7x8 7xyz3 7xyz4 7xyz5 7xyzw8 7xyzw8a ab P7.1 R8a z8a

צריך להתקבל הפלט הבא:

7xyz3

7xyz5

ab

P7.1

z8a

ז"א להתחיל באותיות קטנות בלבד ולהסתיים בספרות 1,3,5,7,9

צריך להשתמש בפקודה grep וכך עשיתי:

ls | egrep ^[a-z]

"[1,3,5,7,9]$"

כל אחת מהפקודות עובדת תקין - כיצד אני משלב בניהם בשביל לקבל פלט הנ"ל ?

תודה.

פורסם

ניתן לכתוב כמה פקודות בשורה, ולעשות ביניהן "לוגיקה" :

פקודה 1 תרוץ, כשהיא מסתימת פקודה 2 תרוץ

command 1 ; command 2

פקודה 1 תרוץ, ואם היא נכשלה פקודה 2 תרוץ

command 1 || command 2

פקודה 1 תרוץ, ואם היא הצליחה פקודה 2 תרוץ

command 1 && command 2

כש grep לא מוצא משהוא שהוא מחפש, זה נחשב ל "כישלון"

תנסה עכשו

פורסם
  • מחבר

נסיתי את כל האפשרוית האלה ולא הצלחתי...אתה יכול לרשום לי איך זה צריך להיות?

פורסם

רמז נוסף : אתה רוצה להריץ 2 פקודות על כל אחד משמות הקבצים אחת אחריי השניה בסדר כזה :

command1 on file1

command2 on file1

command1 on file2

command2 on file2

command1 on file3

command2 on file3

ולא כזה :

command1 on file1

command1 on file2

command1 on file3

command2 on file1

command2 on file2

command2 on file3

ולכן את הלולאה אתה חייב לעשות על ידיי for משלך ולא להשאיר ל pgrep את תפקיד ביצוע הלולאה

פורסם

לולאת for???

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

1. grep לבד יודע להתמודד עם המין שהתבקש.

2. בעצם גם ls (או למעשה הshell) יכול לעשות את זה גם ללא עזרת grep.

3. לא 7xyz3 וגם לאP7.1 עומדים בקריטריון שהגדרת.

פורסם

הדגמה בדרך לפתרון. תמשיך לבד

[ash@viridian ~]$ mkdir new\ folder
[ash@viridian ~]$ cd new\ folder
[ash@viridian new folder]$ touch 7b
[ash@viridian new folder]$ touch 7x8
[ash@viridian new folder]$ touch 7xyz3
[ash@viridian new folder]$ touch 7xyz4
[ash@viridian new folder]$ touch 7xyz5
[ash@viridian new folder]$ touch 7xyzw8
[ash@viridian new folder]$ touch 7xyzw8a
[ash@viridian new folder]$ touch ab
[ash@viridian new folder]$ touch P7.1
[ash@viridian new folder]$ touch R8a
[ash@viridian new folder]$ touch z8a
[ash@viridian new folder]$ ls
7b 7x8 7xyz3 7xyz4 7xyz5 7xyzw8 7xyzw8a ab P7.1 R8a z8a

[ash@viridian new folder]$ for i in `ls` ; do echo $i ; done
7b
7x8
7xyz3
7xyz4
7xyz5
7xyzw8
7xyzw8a
ab
P7.1
R8a
z8a

[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[7] ; done
7b
7x8
7xyz3
7xyz4
7xyz5
7xyzw8
7xyzw8a

[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] ; done
P7.1
R8a

[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] ; echo --$i ; done
--7b
--7x8
--7xyz3
--7xyz4
--7xyz5
--7xyzw8
--7xyzw8a
--ab
P7.1
--P7.1
R8a
--R8a
--z8a

[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] || echo --$i ; done
--7b
--7x8
--7xyz3
--7xyz4
--7xyz5
--7xyzw8
--7xyzw8a
--ab
P7.1
R8a
--z8a

[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] && echo --$i ; done
P7.1
--P7.1
R8a
--R8a

פורסם
  • מחבר

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

זה הכי קרוב שהגעתי אבל זה לא עובד לי...

ls | grep "^[a-z].*[13579]$"

פורסם

אם יש לך דרך לתת ל egrep הוראה כזאת :

"תחפש משהוא שעונה על (תנאי1 ו תנאי2) או (תנאי3 ו תנאי4)"

אתה יכול לכתוב אותה ואז לא צריך for וכדומה

הבעיה היא אם אתה לא יכול (או שאי אפשר, או לא יודע איך) לאמר ל egrep "ו" ו "או", כך שהוא גם יבין מה אתה רוצה ממנו

את ה "ו" ניתן לממש בקלות, על ידיי הפעלת 2 egrepים אחד על השני, כמו 2 מסננים בטור :

"תחפש משהוא שעונה על תנאי1 |תחפש (מתוך זה) משהוא שעונה על תנאי2"

נשארת שאלה איך לממש את ה "או". אני לא מתמצא ב regexps ולכן אני לא חיפשתי פתרון על ידי regexp, אלא פתרון שעובד ברמה של ה comman line

במקום ה "או" שאנחנו רוצים, ניתן לכתוב "אם נכשלת", ולקבל פקודה כזאת :

"תחפש משהוא שעונה על (תנאי1 ו תנאי2), אם נכשלת תחפש משהוא שעונה על (תנאי3 ו תנאי4)"

ואת זה ניתן לכתוב ב bash :, אבל אנחנו רוצים לולאה חיצונית שתריץ את זה כי אנחנו רוצים שה "תחפש, אם נכשלת תחפש" ירוץ על כל קובץ בודד ולא על כל הקבצים ואז שוב על כל הקבצים (אחרת אם יש קובץ שעונה לכל התנאים, הוא יופיע בתוצאה יותר מפעם אחת ואת זה אנחנו לא רוצים)

ביחד זה יוצא דבר כזה :

"תעבור על כל הקבצים

בכל שם קובץ בודד,

"תחפש משהוא שעונה על (תנאי1 ו תנאי2), אם נכשלת תחפש משהוא שעונה על (תנאי3 ו תנאי4)"

או ב bash :

for i in `ls`
do
echo $i |egrep condition1 |egrep condition2 || echo $i |egrep condition3 |egrep condition4
done

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים