עבור לתוכן

מעוניין לכתוב סקריפט לחיפוש ערך מקסימלי

Featured Replies

פורסם

שלום לכולם,

יש לי מספר רב של קבצים עם סיומת LOG.

בתוך הקבצים יש לי משהו שנראה כך:

ic,6,PM___,"port_rcv_crc_error : 5982 )"

אני רוצה שהסקריפט יציג לי את המספר המקסימלי שקיים בפורט 6 (כפי שאפשר לראות יש לי 5982 טעויות בפורט 6.

כיצד ניתן לכתוב זאת?

תודה. לעונים.

פורסם
#!/bin/bash
let max=0
for filename in `ls *LOG`
do
let temp=$((`sed -e 's/error : /\nINTKEY/g;s/ )/\n/g' $filename |grep INTKEY |sed -e 's/INTKEY//g'`))
if [ $temp -gt $max ]
then
let max=$temp
fi
done
echo $max

פורסם
  • מחבר

תודה רבה,

אבל:

syntax error near unexpected token `do

נראה שיש בעיה בפסיק שלפני ה FOR?

ומה הטעם ב BIN/BASH? גם זה מדווח כERROR

פורסם

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

if "error > 16"
command1
command2

אנחנו יכולים לכתוב את זה אבל למה אנחנו מתכוונים ? ניתן להבין דבר כזה ב 2 צורות :

אם מספר שגיאה גדול מ 16 פקודה א ופקודה ב (אם התקבל מספר שגיאה 1 לא תתקיים אף פקודה)

אם מספר שגיאה גדול מ 16 פקודה א. בכל מקרה פקודה ב (אם התקבל מספר שגיאה 1 תתקיים פקודה ב)

לכן אנחנו רוצים דרך שבה אנחנו נאמר למחשב מה הוא חלק מה "אם" ומה מגיע בלי קשר. ב C/C++, PHP וכו משתמשים אם {} :

if "error > 16"
{
command1
}
command2

if "error > 16"
{
command1
command2
}

בגלל זה פקודות כמו if ו for הם לא סתם פקודה בודדת אלא היא מערכת של פקודות - כי אחריי if חייבים "חלקים נוספים" כדיי לקבוע איזה חלק מהפקודות הבאות שייך ל if ואיזה לא

ב bash לא משתמשים אם {} אלא פשוט "מילות מפתח" שהן כמו פקודות נלוות ל if. המילות האלה הן then בשביל ההתחלה ו fi בשביל הסוף. כלומר ב bash הדוגמאות ייראו כך :

if "error > 16"
then
command1
fi
command2

if "error > 16"
then
command1
command2
fi

באותה צורה לפקודת if יש גם אפשרות של else (שלא נמצאת בסקריפט הזה, אתה מנחש מה היא עושה). ול for יש את ה "פקודות הנלוות" do ו done

כל פקודה כזאת היא לא חוקית בלי הפקודות הנלוות. למשל אם תכתוב do סתם כך בלי for (כמו מה שקרה כאן כנראה) הפקודה do לא תתקבל

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

כשאתה כותב פקודות לשורת הפקודה, המחשב מתייחס לכל פקודה בנפרד - אין לו שמץ מה היתה הפקודה שכתבת והקשת Enter בפעם הקודמת. אם אתה כותב פקודת for אתה חייב שה for והפקודות הנלוות המתחייבות מכך - do ו done - יינתנו כחלק מאותה פקודה ארוכה כדיי שהמחשב יראה את ה "תמונה השלמה"

כשאתה כותב קובץ סקריפט המחשב פותח את הקובץ ויש לו את כל הפקודות שם, לכן כותבים את ה for do done בשורות נפרדות (מותר לכתוב בשורה אחת כמו מקודם אבל לא עושים את זה)

כלומר אותן פקודות בדיוק ייראו כך בשורת הפקודה בכתיבה ידנית :

if "error > 16" ; then command1 ; command2 ; fi

וכך אם הן כתובות בקובץ :

if "error > 16"
then
command1
command2
fi

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

let max=0
for filename in `ls *LOG` ; do let temp=$((`sed -e 's/error : /\nINTKEY/g;s/ )/\n/g' $filename |grep INTKEY |sed -e 's/INTKEY//g'`)) ; if [ $temp -gt $max ] ; then let max=$temp ; fi ; done
echo $max

עכשו מה זה #!/bin/bash

זה לא פקודה. בשורת הפקודה # זה סימן של התעלמות כלומר אם תכתוב את זה לשורת הפקודה זה לא יעשה כלום. גם בקובץ סקריפט # זה סימן להתעלמות לכן ניתן לכתוב הערות אל ידיי #. ה #!/bin/bash לא מתבצע כשאתה מריץ את קובץ הסקריפט

התפקיד שלו הוא אחר :

אתה יכול לכתוב סקריםטים לא רק ב bash אלא גם ב perl, python.... אבל את כולם אתה תריץ מתוך bash. השורה הזאת #!/bin/bash אומרת לאיזה תוכנה יש לקרוא כדיי לבצע את הסקריפט. בסקריפט perl למשל היא תיראה כך #!/usr/local/bin/perl

ארכיון

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

דיונים חדשים