[נפתר] זקוק עזרה מעכברי ה awk/sed/grep וכל מי שתותח בparsing של טקסט - לינוקס, Mac ומערכות הפעלה אחרות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


m1ke

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. רק חלק מהדגלים פה מוכר לי. (פרט לדוגמא האחרונה אבל גיליתי שזה לא התאים כי הדף דינאמי מדי).

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

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

'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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...