مدیریت موثر فایل ها در linux با استفاده از دستورات head , tail و cat
چندین برنامه و دستور برای نمایش محتویات فایل در لینوکس موجود است. کار با فایل ها یکی از task های دلهره آور برای اغلب کاربران کامپیوتر چه مبتدی یا کاربر متوسطه، کاربر پیشرفته، برنامه نویس، ادمین و غیره میباشد و در حقیقت کار کردن با فایلها به صورت مفید و موثر یک هنر است.
امروز در این مقاله درباره رایج ترین دستورات به نام head , tail و cat که اغلب ما آنها را میشناسیم اما تعداد کمی در صورت نیاز از آنها استفاده میکنیم بحث خواهیم کرد.
دستور head
دستور head ده (10) خط اول از یک فایل را میخواند. ساختار اصلی دستور head به شرح زیر میباشد :
1 |
head [options] [file(s)] |
برای مثال دستور زیر 10 خط اول فایل /etc/passwd/ را نمایش خواهد داد :
1 2 3 4 5 6 7 8 9 10 11 12 |
# <strong>head /etc/passwd</strong> root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh |
در صورتی که بیشتر از یک فایل مشخص کنیم دستور head از هر فایل 10 خط به صورت مجزا نمایش میدهد. برای مثال دستور زیر 10 خط از هر فایل را نمایش میدهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# head /etc/passwd /etc/shadow ==> <strong>/etc/passwd</strong> <== root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin ==> <strong>/etc/shadow</strong> <== root:$6$85e1:15740:0:99999:7::: bin:*:15513:0:99999:7::: daemon:*:15513:0:99999:7::: adm:*:15513:0:99999:7::: lp:*:15513:0:99999:7::: sync:*:15513:0:99999:7::: shutdown:*:15513:0:99999:7::: halt:*:15513:0:99999:7::: mail:*:15513:0:99999:7::: uucp:*:15513:0:99999:7::: |
اگر بخواهیم که تعداد بیشتری از میزان خطوط پیشفرض این دستور (10 خط) ببینیم باید از گزینه n- که به همراه آن از یک عدد که مشخصه تعداد خطوط هست باید استفاده کنیم. برای مثال دستور زیر 5 خط اول فایل /var/log/yum.log را نمایش خواهد داد :
1 2 3 4 5 6 7 |
# <strong>head -n5 /var/log/yum.log</strong> Jan 10 00:06:49 Updated: openssl-1.0.1e-16.el6_5.4.i686 Jan 10 00:06:56 Updated: openssl-devel-1.0.1e-16.el6_5.4.i686 Jan 10 00:11:42 Installed: perl-Net-SSLeay-1.35-9.el6.i686 Jan 13 22:13:31 Installed: python-configobj-4.6.0-3.el6.noarch Jan 13 22:13:36 Installed: terminator-0.95-3.el6.rf.noarch |
در حقیقت حتی نیاز نیست که از گزینه n- استفاده کنیم میتوانیم تنها از – (دش) و عدد مورد نظر بلافاصله بعد از دش (بدون اسپیس) استفاده کنیم و نتیجه یکسان با دستور بالا داشته باشیم :
1 2 3 4 5 6 7 |
# <strong>head -5 /var/log/yum.log</strong> Jan 10 00:06:49 Updated: openssl-1.0.1e-16.el6_5.4.i686 Jan 10 00:06:56 Updated: openssl-devel-1.0.1e-16.el6_5.4.i686 Jan 10 00:11:42 Installed: perl-Net-SSLeay-1.35-9.el6.i686 Jan 13 22:13:31 Installed: python-configobj-4.6.0-3.el6.noarch Jan 13 22:13:36 Installed: terminator-0.95-3.el6.rf.noarch |
دستور head همچنین میتواند هر تعداد دلخواه byte (کاراکتر) از فایل را با استفاده از گزینه c- نمایش دهد. برای مثال دستور زیر 45 byte از اول فایل داده شده را نمایش میدهد :
1 2 3 |
# <strong>head -c45 /var/log/yum.log</strong> Jan 10 00:06:49 Updated: openssl-1.0.1e-16.el |
دستور tail
دستور tail ده (10) خط آخر از فایل را نمایش میدهد. مشابه دستور head دستور tail هم گزینه n را ساپورت میکند.
برای مثال دستور زیر 10 خط آخر فایل access.log را نمایش میدهد :
1 2 3 4 5 6 7 8 9 10 11 12 |
# <strong>tail access.log</strong> 1390288226.042 0 172.16.18.71 TCP_DENIED/407 1771 GET http://download.newnext.me/spark.bin? - NONE/- text/html 1390288226.198 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.210 1182 172.16.20.44 TCP_MISS/200 70872 GET http://mahavat.gov.in/Mahavat/index.jsp pg DIRECT/61.16.223.197 text/html 1390288226.284 70 172.16.20.44 TCP_MISS/304 269 GET http://mahavat.gov.in/Mahavat/i/i-19.gif pg DIRECT/61.16.223.197 - 1390288226.362 570 172.16.176.139 TCP_MISS/200 694 GET http://p4-gayr4vyqxh7oa-3ekrqzjikvrczq44-if-v6exp3-v4.metric.gstatic.com/v6exp3/redir.html pg 1390288226.402 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.437 145 172.16.18.53 TCP_DENIED/407 1723 OPTIONS http://172.16.25.252/ - NONE/- text/html 1390288226.445 0 172.16.18.53 TCP_DENIED/407 1723 OPTIONS http://172.16.25.252/ - NONE/- text/html 1390288226.605 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.808 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html |
اگر بیشتر از یک فایل در نظر بگیریم 10 خط آخر هر فایل را به صورت مجزا نمایش میدهد :
1 2 3 4 5 6 |
# <strong>tail access.log error.log</strong> ==> access.log <== 1390288226.042 0 172.16.18.71 TCP_DENIED/407 1771 GET http://download.newnext.me/spark.bin? - NONE/- text/html 1390288226.198 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.210 1182 172.16.20.44 TCP_MISS/200 70872 GET http://mahavat.gov.in/Mahavat/index.jsp pg DIRECT/61.16.223.197 text/html 1390288226.284 70 172.16.20.44 TCP_MISS/304 269 GET http://mahavat.gov.in/Mahavat/i/i-19.gif pg DIRECT/61.16.223.197 - 1390288226.362 570 172.16.176.139 TCP_MISS/200 694 GET http://p4-gayr4vyqxh7oa-3ekrqzjikvrczq44-if-v6exp3-v4.metric.gstatic.com/v6exp3/redir.html pg 1390288226.402 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.437 145 172.16.18.53 TCP_DENIED/407 1723 OPTIONS http://172.16.25.252/ - NONE/- text/html 1390288226.445 0 172.16.18.53 TCP_DENIED/407 1723 OPTIONS http://172.16.25.252/ - NONE/- text/html 1390288226.605 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.808 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html ==> error_log <== [Sun Mar 30 03:16:03 2014] [notice] Digest: generating secret for digest authentication ... [Sun Mar 30 03:16:03 2014] [notice] Digest: done [Sun Mar 30 03:16:03 2014] [notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.0-fips configured -- resuming normal operations |
همانطور که گفتیم همچنین میتوان با گزینه n- تعداد خطوط کمتری را از آخر فایل مشاهده کرد :
1 2 3 4 5 6 7 |
# <strong>tail -5 access.log</strong> 1390288226.402 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.437 145 172.16.18.53 TCP_DENIED/407 1723 OPTIONS http://172.16.25.252/ - NONE/- text/html 1390288226.445 0 172.16.18.53 TCP_DENIED/407 1723 OPTIONS http://172.16.25.252/ - NONE/- text/html 1390288226.605 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html 1390288226.808 0 172.16.16.55 TCP_DENIED/407 1753 CONNECT ent-shasta-rrs.symantec.com:443 - NONE/- text/html |
همچنین میتوانید تعداد دلخواه از کاراکترهای یک فایل را با استفاده از گزینه c- مشخص کنیم :
1 2 3 |
# <strong>tail -c5 access.log</strong> ymantec.com:443 - NONE/- text/html |
دستور cat
دستور cat یکی از پر کاربرد ترین دستورها و همچنین ابزار جهانی میباشد. این دستور standard input را در standard output کپی میکند. همچنین اگر فایل متنی طولانی باشد و در یک صفحه جا نشود این دستور scrolling را پشتیبانی میکند یعنی فایل را صفحه، صفحه میکند.
رایج ترین استفاده از دستور cat خواندن محتوای فایل ها است. تمای چیزی که برای باز کردن یک فایل به منظور خواندن آن نیاز داریم نوشتن دستور cat و سپس یک اسپیس (space) و به دنبال آن نام فایل میباشد :
1 2 3 4 5 6 7 8 9 10 11 |
# <strong>cat /etc/passwd</strong> root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh … |
دستور cat همچنین برای به هم پیوستن تعدادی از فایل ها به همدیگر مورد استفاده قرار میگیرد :
1 2 3 4 |
# echo 'Hi Tecmint-Team' > 1 # echo 'Keep connected' > 2 # echo 'Share your thought' > 3 # echo 'connect us tecmint.com@gmail.com' > 4 |
1 |
# cat 1 2 3 4 > 5 |
1 2 3 4 5 6 |
# cat 5 Hi Tecmint-Team Keep connected Share your thought connect us tecmint.com@gmail.com |
همچنین برای ایجاد یک فایل هم مفید میباشد. برای ساختن فایل دستور cat را به همراه redirect کردن خروجی به یک نام فایل استفاه میکنیم :
1 2 3 |
# cat > tecmint.txt Tecmint is the only website fully dedicated to Linux. |
همچنین میتوانیم در پایان یک فایل end قرار دهیم. همانطور که میبینید در مثال زیر انجام شده است :
1 2 3 4 5 6 |
# <strong>cat > test.txt << end</strong> I am Avishek Here i am writing this post Hope your are enjoying end |
1 2 3 4 5 |
#<strong> cat test.txt</strong> I am Avishek Here i am writing this post Hope your are enjoying |
هرگز قدرت بی نظیر دستور cat در کپی کردن فایل ها از خاطر نبرید :
1 2 3 |
# cat avi.txt I am a Programmer by birth and Admin by profession |
1 |
# cat avi.txt > avi1.txt |
1 2 3 |
# cat avi1.txt I am a Programmer by birth and Admin by profession |
و اکنون متضاد cat چیست؟ بله tac است. tac یک دستور تحت لینوکس است بهتر است به جای اینکه درباره آن چیزی بگوییم یک مثال عملی نشان تان بدهیم.
فایل متنی شامل نام همه ماه های سال که هر ماه به صورت مجزا در یک خط باشد را ایجاد میکنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# <strong>cat month</strong> January February March April May June July August September October November December |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# <strong>tac month</strong> December November October September August July June May April March February January |