[ سطر الأوامر] طرق متنوعة لإستخلاص معلومات محددة من ملفات xml و غيرها

بسم الله و الحمد لله و الصلاة و السلام على رسول الله و آله و أصحابه و من إتبع هداه.

هذه طرق مختلفة لإستخراج جزء معين من بيانات. قد تكون ملف نصي أو بصيغة xml أو html أو ملفات logs.
الطريقة و القاعدة الأساس لا تختلف.
أغلب هذه الطرق .إستخدمت أدوات grep و sed و cut و بعض الحالات awk.

طريقة إستخراج جزء روابط تحميل مباشرة للصوتيات

هذا مثال للجزء الذي سنعمل عليه.

ound-data="https://dl12.sura.pw/dl/reciter/22/24/001.mp3?h=mo4VedOLdpE2GIFaVn_UAg&expires=1658874093"

كيف حصلت على هذه المعلومات. إستخدمت أداة lynx للحصول على مصدر صفحة تحميل الصوتيات. و توجيه الخرج إلى ملف.

lynx -source https://suratmp3.com/quran/reciters/22 > filesrc-suratmp3.txt

بعد ذلك نطلع على محتوى الملف . و نبحث عن الجزء
المتعلق بملفات mp3. ثم نستخدم grep لطباعة ذلك الجزء.

ound-data="https://dl12.sura.pw/dl/reciter/22/24/001.mp3?h=mo4VedOLdpE2GIFaVn_UAg&expires=1658874093"
  • كما تلاحظون صيغة الملف mp3 موجودة في المقطع. هذا يعني أنه الرابط الخاص بتحميل الملف.
  • إلى الآن الموضوع لم يبدأ بعد :grin:
  • الآن نريد إستخلاص رابط التحميل فقط. أول خطوة هي الإنتباه إلى حروف تحديد الحقول. في هذه الحالة يوجد لذينا . حروف -:_/.=
  • الفكرة هو إختيار محدد واحد يوصلنا إلى النتيجة التي نريد.
    في هذه الحالة رمز = يساوي جيد.

الآن نبدأ تطبيق هذه مبادئ

grep 'dl12' filesrc-suratmp3.txt | cut -d= -f2

"https://dl12.sura.pw/dl/reciter/22/24/112.mp3?h

كما تلاحظون أخذنا الحقل الثاني.النتيجة تبدو جيدة. و لكن تحتاج المزيد من التنظيف .
سنستخدم sed لحذف حرف h في آخر السطر.

grep 'dl12' filesrc-suratmp3.txt | cut -d= -f2 | sed -e 's/h$//g'

رمز $ يعني آخر السطر. يعني حرف h الموجود بآخر السطر.
حرف g في هذه الحالة لا نحتاجه. وضعته إحتياطا. عمله القيام بعملية الإستبدال على جميع النتائج التي تجدها أداة sed.

  • السطر الآن سيبدوا بهذا الشكل :
grep 'dl12' filesrc-suratmp3.txt | cut -d= -f2 | sed -e 's/h$//g'

"https://dl12.sura.pw/dl/reciter/22/24/113.mp3?

جميل. نحتاج فقط التخلص من علامتي و ؟“”
نضيف عملية آخرى لأداة sed

grep 'dl12' filesrc-suratmp3.txt | cut -d= -f2 | sed -e 's/h$//g' -e 's/["?]//g'

النتيجة المحصل عليها.

grep 'dl12' filesrc-suratmp3.txt | cut -d= -f2 | sed -e 's/h$//g' -e 's/["?]//g' | head -n4                           https://dl12.sura.pw/dl/reciter/22/24/001.mp3                                     https://dl12.sura.pw/dl/reciter/22/24/002.mp3                                     https://dl12.sura.pw/dl/reciter/22/24/003.mp3                                     https://dl12.sura.pw/dl/reciter/22/24/004.mp3

جميل. هذا ما نريده. الآن نضع الروابط داخل ملف لتحميلها لاحقا.

grep 'dl12' filesrc-suratmp3.txt | cut -d= -f2 | sed -e 's/h$//g' -e 's/["?]//g' > suratmp3-mothafer-links.txt

طريقة فرز المعلومات و إستخلاصها. لا توجد لها قاعدة عامة. المستخدم ينسجم مع كل حالة. و يستخدم محددات الحقول التي ستوصله إلى ما يريد في أقل الخطوات.
و هذا أيضا ينطبق على الأدوات. في بعض الحالة يفضل إستخدام أداة عن أخرى.

سأضيف مثال آخر. سبق لي وضعته بمجموعة تليجرام الخاصة بمجتمع أسس

نسخ و لصق :grin:

مثال لتحميل صوتيات من موقع mp3quran
نقوم بتحميل مصدر الصفحة. و توجيه المخرجات لملف.

lynx -source https://mp3quran.net/ar/souilass > filesrc

بعد ذلك . عزل فقط روابط تحميل الملفات و توجيهها لملف. أعتقد السطر واضح. من لم يفهم. يسأل.

grep -n "server16" filesrc | cut -d= -f4 | sort | uniq | sed 's/["\>]//g' > souilas-mp3-list.txt

شكل الروابط.


File: souilas-mp3-list.txt
https://server16.mp3quran.net/download/so
uilass/Rewayat-Warsh-A-n-Nafi/001.mp3
https://server16.mp3quran.net/download/so
uilass/Rewayat-Warsh-A-n-Nafi/018.mp3
https://server16.mp3quran.net/download/so
uilass/Rewayat-Warsh-A-n-Nafi/019.mp3
https://server16.mp3quran.net/download/so
uilass/Rewayat-Warsh-A-n-Nafi/025.mp3
https://server16.mp3quran.net/download/so
uilass/Rewayat-Warsh-A-n-Nafi/050.mp3

الآن يكفي فقط . إستخدام أداة لتحميل الملفات.

wget -c -i souilas-mp3-list.txt

جميل. نضيف الآن . أمثلة أخرى.

<Key>Shared_Value</Key>

نريد فقط قيمة المفتاح . نستخدم awk

awk -F '[<>]' '{ print $3}' <<< $data
Shared_Value

عملية بسيطة. تحديد محددين <> و طباعة الحقل الثالث. يعني قيمة المفتاح.

طريقة أخرى بإستخدام sed.

echo $data | sed 's/[><]/ /g' | cut -d ' ' -f3
Shared_Value

قمنا بإستبدال رمزي >< بمساحة. ثم إستخدمنا هذه المساحة كمحدد حقل. بعد ذلك قمنا بطباعة الحقل الثالث.

مثال آخر :

<?xml version="1.0" encoding="UTF-8"?>
<blah>
    <blah1 path="er" name="andy" remote="
origin" branch="master" tag="true" />
    <blah1 path="er/er1" name="Roger" rem
ote="origin" branch="childbranch" tag="tr
ue" />
    <blah1 path="er/er2" name="Steven" re
mote="origin" branch="master" tag="true"
/>

</blah>

نريد طباعة فقط كلمة master .الموجودة بالسطر الذي توجد به كلمة andy

الحيلة الأولى إستخدام كلمة andy لتوجيه إهتمامنا حول ذلك السطر فقط.

grep 'andy' andy.xml                    <blah1 path="er" name="andy" remote="origin" branch="master" tag="true" />

أيضا كما يبدو يوجد الكثير من محددات =
جميل . نستغلهم.

grep 'andy' andy.xml | cut -d= -f5  
"master" tag

جميل . نقترب منا نريده

نضيف عملية لأداة sed التنظيف

grep 'andy' andy.xml | cut -d= -f5 | sed -e 's/tag//g' -e 's/\"//g'
master

جيد. هذا ما نريده.
قامت sed بإستبدال كلمة tag بلاشيء . يعني حذفتها. و الشطر الثاني من العملية حذف رمزي “” حول كلمة master.

  • مثال آخر :
<modelVersion>4.0.0</modelVersion>       <groupId>com.mycompany</groupId>
    <artifactId>project-parent</artifactI
d>
    <name>project-parent</name>
    <version>1.0.74-SNAPSHOT</version>
    <dependencies>
        <dependency>
        <groupId>com.sybase.jconnect</gro
upId>
        <artifactId>jconnect</artifactId>
        <version>6.05-26023</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId
>

نريد الحصول هذا الجزء
1.0.74-SNAPSHOT

$ cat pom.xml | awk -F'[<>]' '/SNAPSHOT/{print $3}'
1.0.74-SNAPSHOT

نفس الطريقة . إستخدام محددات الحقول <> ثم طباعة الحقل الذي نريد.

  • طريقة أخرى بإستخدام sed
grep "SNAPSHOT" pom.xml | sed -e 's/<version>//' -e 's/<\/version>//' -e 's/^[[:blank:]]*//'
1.0.74-SNAPSHOT

حذف مفاتيح النسخة عن طريقة عملتين. و عملية أخيرة لحذف الفراغ في بداية السطر.
هذه كلها طرق للمبتدئين. شخص محترف سيقوم بأفضل من هذه الطرق.

  • مثال آخر :
echo $DATA
<element name="Barium"/>

نريد الحصول على كلمة Barium فقط

echo $DATA | cut -d= -f2
"Barium"/>
echo $DATA | cut -d= -f2 | sed -e 's/[\"\/\>]//g'
Barium

جميل.

  • مثال أخير :
grep '' data.xml
<item>
  <title>15:54:57 - George:</title>
  <description>Diane DeConn? You saw Diane DeConn!</description>
</item>
<item>
  <title>15:55:17 - Jerry:</title>
  <description>Something huh?</description>
</item>

نريد العنوان الخاص بجورج فقط.

grep 'George' data.xml
  <title>15:54:57 - George:</title>
grep 'George' data.xml | cut -d\> -f2 | cut -d\< -f1
15:54:57 - George:

قمنا بإستخدام محددات حقول >< و لكن يجب تجاوزها برمز .
لكي لا تواجهوا مشكلة.

إلى هنا ينتهي الموضوع

الهدف منه . إعطاء فكرة عن طريقة التعامل مع مثل هذه الحالات . لا توجد قاعدة واحدة عامة .
كل حالة و طريقة التعامل معها.

6 إعجابات

معلومات دسمة، بوركت.

يستحق وضع علامة مرجعيه … :+1: