انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => انجمن عمومی => نویسنده: abdossamad2003 در 22 خرداد 1397، 06:22 ب‌ظ

عنوان: در مورد دستور grep (حل شد)
ارسال شده توسط: abdossamad2003 در 22 خرداد 1397، 06:22 ب‌ظ
[samad@localhost test]$ head s1
depth lat lon SALT
0.0 -89.875 -179.875 34.02139
0.0 -89.875 -179.625 33.989212
0.0 -89.875 -179.375 33.989212
0.0 -89.875 -179.125 33.989212
0.0 -89.875 -178.875 33.989212
0.0 -89.875 -178.625 33.98929
0.0 -89.875 -178.375 33.98929
0.0 -89.875 -178.125 33.98929
0.0 -89.875 -177.875 33.98929


[samad@localhost test]$ grep -e "-89.875 -179.875" s1
[samad@localhost test]$

با سلام خدمت دوستان
سوال من اینه که چرا دستور grep نتوانست عبارت فوق را در فایل s1  که موجود هم بود پیدا کند!! آیا باید آپشن جدید به دستور grep باید اضافه شود

با تشکر
عنوان: پاسخ : در مورد دستور grep
ارسال شده توسط: علی رزم دیده در 22 خرداد 1397، 07:29 ب‌ظ
با سلام
شما قبل از اینکه grep استفاده کنین باید ببینین کارکتر های فایل شما چیا هستن.
می تونین این کارو با تبدیل متن فایل به کد اسکی انجام بدین :
sed -n '2p' s1 | od -An -vtu1
  48  46  48   9  45  56  57  46  56  55  53   9  45  49  55  57
  46  56  55  53   9  51  52  46  48  50  49  51  57  10
اگه به خروجی دستور بالا توجه کنین می بینین که کارکتر بین اون دو ستون اسپیس نیست (کد اسکی 32 - SP) ، بلکه بین اون دو ستون تب قرار داره (کد اسکی 9 - HT).

پس حالا می تونین با این دستور grep بگیرین :
grep -Pe "-89.875\t-179.625" s1
عنوان: پاسخ : در مورد دستور grep
ارسال شده توسط: abdossamad2003 در 23 خرداد 1397، 01:24 ق‌ظ
با تشکر از پاسخ دوست عزیز
در مثال فوق فاصله بین 0.0 و 89.875- را چی قرار دهیم ( با توجه به کد اسکی شما که احتمالا 48 در خروجی دستور شما می باشد )

با تشکر دوباره
عنوان: پاسخ : در مورد دستور grep
ارسال شده توسط: علی رزم دیده در 23 خرداد 1397، 01:28 ق‌ظ
خواهش می کنم دوست عزیز.

بین 0.0 و 89.875- هم ، همچنان ht قرار داره. (48 مربوط به 0 هستش و 46 مربوط به . و 48 بعدی مربوط به 0 بعدی و اگه دقت کنین بعد اون 9 قرار داره)

پس هم چنان می تونین از این دستور استفاده کنین :
grep -Pe "0.0\t-89.875" s1
عنوان: پاسخ : در مورد دستور grep
ارسال شده توسط: abdossamad2003 در 23 خرداد 1397، 01:53 ق‌ظ
با تشکر
ابتدا یک مرجع که شما از آن این دستورات و اصظلاحات را یاد گرفته اید معرفی کنید
دوم : در مثال زیر که خروجی آن زیاد است و قسمتی را نشان دادم
[samad@localhost test]$ grep -Pe '51.125\t38.125' SALT.txt
0.0 -51.125 38.125 33.8183
0.0 51.125 38.125 6.04349
5.0 -51.125 38.125 33.80809
5.0 51.125 38.125 10.948
10.0 -51.125 38.125 33.800213
10.0 51.125 38.125 10.197109
15.0 -51.125 38.125 33.79801
15.0 51.125 38.125 17.98969
20.0 -51.125 38.125 33.80941
20.0 51.125 38.125 18.0277
25.0 -51.125 38.125 33.815212
25.0 51.125 38.125 18.03911
30.0 -51.125 38.125 33.8239
30.0 51.125 38.125 18.04411
35.0 -51.125 38.125 33.8278
35.0 51.125 38.125 18.06271
40.0 -51.125 38.125 33.83239
40.0 51.125 38.125 18.098991
45.0 -51.125 38.125 33.8399
^C



مشکل اینجاست که نمی خواهم سطرهای مربوط به 51.125- نشان داده شود چون در دستور فوق 51.125 را قرار داده ام

عنوان: پاسخ : در مورد دستور grep
ارسال شده توسط: علی رزم دیده در 23 خرداد 1397، 02:26 ق‌ظ
خواهش می کنم

وقتی شما دارین توی grep از 51.125 استفاده می کنین هر کلمه یا عبارتی که این عدد جزئی از اون باشه هم تو خروجی به نمایش در میاد اگه شما می خواین فقط 51.125 انتخاب بشه می تونین از این دستور استفاده کنین (در واقع این دستور می گه که اون اعدادی که پشتشون تب وجود داره انتخاب بشن) :
grep -Pe "\t51.125\t38.125" SALT.txt
هم چنین تو موارد مشابه می تونین از سوییچ -w مربوط به grep هم استفاده کنین.

در مورد اون یکی سوالتون هم من این کتاب ها رو برای بش مطالعه کردم:
نقل‌قول
bash Cookbook - Carl Albing, JP Vossen, and Cameron Newham
Linux Shell Scripting Essentials - Sinny Kumari
و بعد از اون ها مطالعه ی man پیج ها خیلی مفید می تونه باشه.
عنوان: پاسخ : در مورد دستور grep
ارسال شده توسط: abdossamad2003 در 23 خرداد 1397، 02:43 ق‌ظ
با تشکر