עבור לתוכן
  • צור חשבון
  • מי אנחנו?

    שלום אורח/ת!

     
    שים לב - על מנת להשתתף בקהילה שלנו, להגיב ולפתוח דיונים חדשים, עליך להצטרף כחבר רשום.

    החברים שלנו נהנים מיתרונות רבים, כולל היכולת להשתתף בדיונים, להנות מהגרלות ומבצעים לחברי האתר, ולקבל מידי שבוע את התכנים הבולטים שלנו ישירות במייל.

    לא אוהבים שמציקים לכם במייל? ניתן להירשם לאתר אך לוותר על הרישום לעידכוני המייל השבועיים.

ארכיון

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

m1ke

[נפתר] זקוק עזרה מעכברי ה awk/sed/grep וכל מי שתותח בparsing של טקסט

Recommended Posts

אהלן,

יש לי קובץ HTML די מסובך של דף סטאטוס של tomcat. אני רוצה להוציא סטרינג מאוד מסויים ממנו לצרוך ניטור (מספר הטראדים הפעילים).

אם זה היה בvbscript הייתי פשוט מכין מחרוזת regex בסגנון של:

busy thread count: ([0-9])

ואז מבקש לקבל רק את ה occurrence ה-1 (כלומר המספר עצמו).

אני יודע שב sed למשל אני יכול לבטא את זה בעזרת \1 אבל אני רוצה להדפיס רק את הספרה, ולא את כל השורה המכילה את השורה...

בקיצור הנה דוגמא לחלק מהHTML:

<h1>JVM</h1><p> Free memory: 158.63 MB Total memory: 1021.50 MB Max memory: 1021.50 MB</p><h1>jk-172.16.1.16-8009</h1><p> Max threads: 200 Current thread count: 4 Current thread busy: 1<br> Max processing time: 0 ms Processing time: 0.0 s Request count: 0 Error count: 0 Bytes received: 0.00 MB Bytes sent: 0.00 MB</p><table border="0"><tr><th>Stage</th><th>Time</th><th>B Sent</th><th>B Recv</th><th>Client</th><th>VHost</th><th>Request</th></tr></table><p>P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive</p><h1>http-172.16.1.16-8080</h1><p> Max threads: 300 Current thread count: 300 Current thread busy: 234<br> Max processing time: 186422 ms Processing time: 4855021.0 s Request count: 53299920 Error count: 117878 Bytes received: 46206.53 MB Bytes sent: 2049.89 MB</p><table border="0"><tr><th>Stage</th><th>Time</th><th>B Sent</th><th>B 

אני רוצה לקבל חזרה רק 234. הכל דרך cli באובונטו.

רעיונות?

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

אני ארשום לך כמה אופציות.

אני יכול לעשות את זה יותר פשוט, אבל השאלה הכללית היא עד כמה דינמית השורה הזו (עד כמה היא עלולה להשתנות).

תבדוק את הדברים שעשיתי פה במצבים שונים לראות אם זה תמיד "תופס":

דוגמא א' (יוציא את ה 243 משתמש ב BUSY השני בכדי למצוא את המחרוזת)

sed 's/\ /\t/g'|sed 's/\t/\n/g' | sed -n '/busy/{n;p;}'|tail -n 1 | sed 's/<.*//g'

אם השורה הזו למשל נמצאת בקובץ myfile אתה עושה לפני כל השורה שלמעלה את :

cat myfile | 

ואז מוסיף את מה שרשמתי.

דוגמא ב'

 sed 's/[a-zA-Z]\n/g' | sed -n '/bus/{n;p;}' | tail -n 1 | sed 's/<.*//g'

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

דוגמא ג' בעזרת AWK:

awk {'print $73'} | sed 's/<.*//g'

רק צריך לשים לב שעם ה AWK שעשיתי זה הולך לפי רווחים וסופר עד הערך ב 73, אז אם הפורמט של השורה הזו משתנה, ה 73 שציינתי ב AWK לא יתאים לערך אותו אתה מחפש

נ.ב זה יעבוד לא רק באובונטו

מקוה שעזרתי...

בהצלחה!

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

תודה נוריאל, אנסה את כולן ואנסה להבין איך אתה בונה את הparsing. רק חלק מהדגלים פה מוכר לי. (פרט לדוגמא האחרונה אבל גיליתי שזה לא התאים כי הדף דינאמי מדי).

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

תודה נוריאל, אנסה את כולן ואנסה להבין איך אתה בונה את הparsing. רק חלק מהדגלים פה מוכר לי. (פרט לדוגמא האחרונה אבל גיליתי שזה לא התאים כי הדף דינאמי מדי).

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

בשביל הטכניקה שהשתמשתי, הצטרכתי לפרק את השורה הארוכה הזו לכמה שורות, זאת עשיתי למשל בדוגמא ב' ע"י

's/[a-zA-Z]:/\n/g'

שאומר חפש כל אות (גדולה\קטנה) שאחריה מופיעות נקודותיים והחלף את אילו בשורה חדשה (n\).

אחרי זה אני מחפש את הערך busy או bus מכיוון שמופיע פעמיים אני עושה tail -n 1 כי הערך הרצוי מופיע אחרון.

אחרי זה תוספת sed "לנקות" את ה <br> ...

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

א. תלוי באיזה סינטקס אתה שולט יותר בשביל לבצע את מה שאתה צריך, בכל אופן גם לא רע לשלב sed ו awk באותה השורה \ סקריפט.

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

ויש לך את perl מה cmd:

perl -pe "/busy:[ ][0-9]{2,5}/; print \"Threads $&\n\";" myfile.html | head -n 1

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

Perl אידיאלית ל text parsing

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

×
  • צור חדש...
Back to top button
Close
Close