linux练习
本帖最后由 haide1014 于 2014-07-07 17:53 编辑 1、关于ls命令 ls命令列出目录下的内容 [root@ 51itstudy.com ~]# ls anaconda-ks.cfg install.log test 加上-s参数列出内容的同时列出该文件或目录的大小 [root@ 51itstudy.com ~]# ls -s 8 anaconda-ks.cfg 36 install.log 32 test 加上-h参数将会显示出文件大小的单位 [root@ 51itstudy.com ~]# ls -sh 8.0K anaconda-ks.cfg 36K install.log 32K test -l参数显示该目录下的详细信息 [root@ 51itstudy.com ~]# ls -lh //该命令可简写为ll -h -rw——- 1 root root 1.5K Nov 5 16:28 anaconda-ks.cfg -rw-r–r– 1 root root 32K Nov 5 16:27 install.log -rw-r–r– 1 root root 32K Nov 6 17:37 test 注:根据上面的两个命令可以看到,install.log用ls -s查看时大小是36K,而用ll -h查看时大小是32K,这是因为ll -h命令查看的是实际文件所占有的大小,而ls -h查看的是磁盘非配的大小 2、使用stat 命令列出目录或文件的详细信息 [root@ 51itstudy.com ~]# stat install.log File: `install.log' Size: 32062 Blocks: 72 IO Block: 4096 regular file Device: fd00h/64768d Inode: 5898242 Links: 1 Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-11-06 17:37:03.000000000 +0800 Modify: 2013-11-05 16:27:52.000000000 +0800 Change: 2013-11-05 16:28:19.000000000 +0800 ls排序的问题 ls默认状态下是按照文件目录的首字母排序 -t : 按照文件最后的修改时间排序 -u : 按照文件的最后访问时间排序 -c : 按照文件的最后inode改变时间排序 比如要查看当前目录下最新改变的文件或目录: [root@ 51itstudy.com ~]# ls -u | head -1 Desktop 列出最近改变时间排序的文件的详细信息 [root@ 51itstudy.com etc]# ls -l `ls -u | head -1` -rw-r–r– 1 root root 889 Dec 12 19:37 group 列出目录信息: [root@ 51itstudy.com /]# ls -ld u01 drwxr-xr-x 6 oracle oinstall 4096 Dec 4 19:44 u01 文件类型标识符: * 可执行文件 / 目录文件 = Socket文件 @ 符号链接文件 | 管道文件 使用-F参数可以列出文件的标识符 [root@ 51itstudy.com db_1]# ls -F assistants/ install.platform oc4j/ rdbms/ bin/ inventory/ odbc/ relnotes/ cdata/ javavm/ olap/ root.sh* cfgtoollogs/ jdbc/ OPatch/ root.sh.old* 3、sort命令 sort命令可以完成多类别排序 将当前目录下的文件按照大小排序: [root@ 51itstudy.com ~]# du -k * 8 anaconda-ks.cfg 4 Desktop 36 install.log 8 install.log.syslog 32 test [root@ 51itstudy.com ~]# du -k * | sort -n 4 Desktop 8 anaconda-ks.cfg 8 install.log.syslog 32 test 36 install.log 按照指定的列排序 查看当前目下下的文件信息并按照第六列的信息以数字排序 [root@ 51itstudy.com ~]# ll -s | sort -n -k 6 8 -rw——- 1 root root 1482 Nov 5 16:28 anaconda-ks.cfg 8 -rw-r–r– 1 root root 3995 Nov 5 16:26 install.log.syslog 4 drwxr-xr-x 2 root root 4096 Nov 6 00:03 Desktop 36 -rw-r–r– 1 root root 32062 Nov 5 16:27 install.log 32 -rw-r–r– 1 root root 32063 Nov 6 17:37 test 注:RedHat4以后再没有sort +4这样的格式,取而代之的是sort -k 4 也可加入-r参数来实现逆向排序 [root@ 51itstudy.com ~]# ll -s | sort -n -k 6 -r 32 -rw-r–r– 1 root root 32063 Nov 6 17:37 test 36 -rw-r–r– 1 root root 32062 Nov 5 16:27 install.log 4 drwxr-xr-x 2 root root 4096 Nov 6 00:03 Desktop 8 -rw-r–r– 1 root root 3995 Nov 5 16:26 install.log.syslog 8 -rw——- 1 root root 1482 Nov 5 16:28 anaconda-ks.cfg 加入tail来选择输出最后的几行 [root@ 51itstudy.com ~]# ll -s | sort -n -k 6 -r | tail -3 8 -rw-r–r– 1 root root 3995 Nov 5 16:26 install.log.syslog 8 -rw——- 1 root root 1482 Nov 5 16:28 anaconda-ks.cfg total 88 5、head和tail命令 head -n和tail -n分别查看文件的前几行和后几行记录,不加参数默认的是10行 [root@ 51itstudy.com ~]# cat number 1 2 3 4 5 [root@ 51itstudy.com ~]# tail -2 number 4 5 [root@ 51itstudy.com ~]# head -2 number 1 2 -n 参数后面跟 +n(数字) 用来显示第n行前(head)或第n行后(tail)的所有数据结合两者可以实现显示第n-m行的数据 如显示第2-5行数据的显示 [root@ 51itstudy.com ~]# head -n +5 number | tail -n +2 2 3 4 5 tail -f 动态刷新木文件的后十行数据 [root@ 51itstudy.com ~]# tail -f number 1 2 3 4 5 6、Find查找命令 查找当前目录下名为number的文件 [root@ 51itstudy.com ~]# find . -name number ./number 查找当前目录下num开头的文件 [root@ 51itstudy.com ~]# find . -name 'num*' ./number 查找当前目录下test001,test002文件 [root@ 51itstudy.com ~]# find . -name ’test00[1-2]' ./test001 ./test002 不区分大小写来查找Test001[1-2]或test00[1-2]' [root@ 51itstudy.com ~]# find . -iname ’test00[1-2]' ./test001 ./Test002 ./Test001 ./test002 查找最近连天修改过的文件 [root@ 51itstudy.com linux]# find . -mtime -2 . ./test001 ./Test003 ./Test002 ./Test001 ./test003 ./test002 查找两天之前修改过的文件 [root@ 51itstudy.com ~]# find . -mtime +2 ./.gnome ./.gnome/gnome-vfs ./.dmrc ./.gnome2_private ./.Trash ./.bashrc ./install.log.syslog 把mtime改成ctime:按照改变时间查找 atime按照访问时间查找 也可以把mtime,ctime,atime改成mmin,cmin,amin来按照分钟改变查找 [root@ 51itstudy.com linux]# find . -mmin -10 . ./test001 ./Test003 ./Test002 ./Test001 -maxdepth定义递归查询的级数 [root@ 51itstudy.com ~]# find . -maxdepth 1 -iname ’test00[1-2]' ./test001 ./Test002 ./Test001 ./test002 [root@ 51itstudy.com ~]# find . -iname ’test00[1-2]' ./linux/test001 ./linux/Test002 ./linux/Test001 ./linux/test002 ./test001 ./Test002 ./Test001 ./test002 查找当前目录下大于10k的文件 [root@ 51itstudy.com ~]# find . -size +10k ./.bash_history ./test ./install.log ./.gconfd/saved_state ./.gnome2/yelp.d/omfindex.xml ./.gnome2/yelp.d/manindex.xml ./.gnome2/yelp.d/sk-content-list.last ./.gstreamer-0.10/registry.i686.bin 查找当前目录下oracle用户的文件,递归深度为2 [root@ 51itstudy.com home]# find . -maxdepth 2 -user oracle ./oracle ./oracle/.sqlplus_history ./oracle/hot_backup.sh ./oracle/.gnome2_private ./oracle/rman_full_backup.sh.bak ./oracle/.bashrc ./oracle/log 显示当前目录下文件所属组是oinstall的文件,深度为二,只显示出前两个文件的详细信息 [root@ 51itstudy.com home]# ls -l `find . -maxdepth 2 -group oinstall`|head -2 -rw——- 1 oracle oinstall 8502 Dec 7 14:37 ./oracle/.bash_history -rw-r–r– 1 oracle oinstall 33 Nov 6 16:09 ./oracle/.bash_logout 查找当前目录下的所有目录: [root@ 51itstudy.com ~]# find . -maxdepth 1 -type d . ./linux ./.gnome ./.gnome2_private grep命令用来过滤信息 测试文件如下: [root@ 51itstudy.com ~]# cat number 1 number1 2 number2 3 number3 4 number3 5 number5 显示number中含有2的行: [root@ 51itstudy.com ~]# grep 2 number 2 number2 查看/home/oracle/.bash_profile中的注释信息 [root@ 51itstudy.com oracle]# grep "#" .bash_profile # .bash_profile # Get the aliases and functions # User specific environment and startup programs 查询.bash_profile中含有export或alias的行 [root@ 51itstudy.com oracle]# grep "export\|alias" .bash_profile # Get the aliases and functions export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/10.2.0/db_1 export ORACLE_SID=orcl export PATH=$PATHORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lin:/lin:/usr/lib alias sqlplus=' rlwrap sqlplus' alias rman=' rlwrap rman' 使用egrep完成上面的题目 [root@ 51itstudy.com oracle]# egrep "export|alias" .bash_profile # Get the aliases and functions export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/10.2.0/db_1 export ORACLE_SID=orcl export PATH=$PATHORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lin:/lin:/usr/lib alias sqlplus=' rlwrap sqlplus' alias rman=' rlwrap rman' -i参数用来忽略大小写 [root@ 51itstudy.com ~]# grep NUMBER number [root@ 51itstudy.com ~]# grep -i NUMBER number 1 number1 2 number2 3 number3 4 number3 5 number5 -v 参数查找不包括某个字符的行 [root@ 51itstudy.com ~]# grep -i NUMBER number | grep -v 5 1 number1 2 number2 3 number3 4 number3 -n 参数用来标记行号 [root@ 51itstudy.com ~]# grep -i NUMBER number | grep -v 5 -n 1:1 number1 2:2 number2 3:3 number3 4:4 number3 过滤掉空行和过滤行: [root@ 51itstudy.com ~]# cat number -n 1 1 number1 2 2 number2 3 4 3 number3 5 6 4 number3 7 5 number5 8 # This is a test file [root@ 51itstudy.com ~]# grep -n -v '^$' number | grep -v '#' 1:1 number1 2:2 number2 4:3 number3 6:4 number3 7:5 number5 7、cut命令用来选取指定列 [root@ 51itstudy.com ~]# cat number 1 :number1 2 :number2 3 :number3 4 :number3 5 :number5 # This is a test file [root@ 51itstudy.com ~]# cat number | grep -v "#" | grep -v "^$" | cut -d ":" -f2 number1 number2 number3 number3 number5 上面的命令等于是在grep的基础上,去除注释和空行,以:为分隔符,显示第二列 只显示当前目录下文件名和创建时间 [root@ 51itstudy.com ~]# ll | cut -c 37- 16:28 anaconda-ks.cfg 00:03 Desktop 16:27 install.log 16:26 install.log.syslog 10:53 linux 11:33 number 17:37 test 10:49 test001 10:51 Test001 10:49 test002 10:51 Test002 10:49 test003 10:51 Test003 10:49 test004 -d参数用来删除指定的字符 [root@ 51itstudy.com ~]# df |grep -v Filesystem | awk '{ print $5 }' / 13% 0% [root@ 51itstudy.com ~]# df |grep -v Filesystem | awk '{ print $5 }'|cut -d '%' -f1 / 13 0 8、sed流编译器 打印1-3行 [root@ 51itstudy.com ~]# sed '1,3p' number 1 :number1 1 :number1 2 :number2 2 :number2 3 :number3 4 :number3 5 :number5 取消打印1-3行 [root@ 51itstudy.com ~]# sed -n '1,3p' number 1 :number1 2 :number2 删除第3行记录 [root@ 51itstudy.com ~]# cat number 1 number1 2 number2 3 number3 4 number4 5 number5 [root@ 51itstudy.com ~]# sed '3d' number 1 number1 2 number2 3 number3 4 number4 5 number5 删除最后一行 [root@ 51itstudy.com ~]# sed '$d' number 1 number1 2 number2 3 number3 4 number4 5 number5 删除第三行到最后一行 [root@ 51itstudy.com ~]# sed '3,$d' number 1 number1 2 number2 删除包含number2的行 [root@ 51itstudy.com ~]# sed '/number2/d' number 1 number1 3 number3 4 number4 5 number5 Hello 9、awk生成数据 [root@ 51itstudy.com ~]# cat number 1 number1 2 number2 3 number3 4 number4 5 number5 Hello 查找包含number2的行 [root@ 51itstudy.com ~]# awk '/number2/' number 2 number2 匹配第二列中数据包含number2的数据 [root@ 51itstudy.com ~]# awk '$2 ~ /number2/' number 2 number2 $2匹配表示第二列数据,~为匹配符 打印number中第一列的内容 [root@ 51itstudy.com ~]# awk '{print $1}' number 1 2 3 4 5 Hello -F参数指定分隔符 打印passwd中的第一列的最后十名用户名信息 [root@ 51itstudy.com ~]# awk -F: '{print $1}' /etc/passwd | tail -10 sabayon test2 ldap ais test1 oracle admin user01 user02 xtt 使用cut也能达到此效果 [root@ 51itstudy.com ~]# cut -d: -f1 /etc/passwd|tail -10 sabayon test2 ldap ais test1 oracle admin user01 user02 xtt 简单的邮件: [root@ 51itstudy.com ~]# service sendmail status sendmail (pid 3845) is running… [root@ 51itstudy.com ~]# hostname xue.com [root@ 51itstudy.com ~]# hostname xue.com [root@xue ~]# mail root Subject: Hello [root@xue ~]# mail root Subject: Hello Hello,Admin Bye Cc: 10、自动化作业: 使用corn命令完成自动化作业 查看服务是否正常启动 [root@xue ~]# service crond status crond (pid 3871) is running… 使用corntab命令下的三个参数:-l,-e,-r分别为产看,编译和删除自动化任务 自动化任务的语法很简单: * * * * 0 df -h >> /var/log/system.log 其中:前面的五个列分别表示:分,时,日,月,星期;若为*表示不适用该时间格式进行计划任务,若需要多个时间段,可用,分开 比如上面的命令表示每周日的时候查看一下系统信息,并追加入system.log 每周的工作日,每个十五分钟执行一个备份脚本: 0,15,30,45 * * * 0 /home/backuo/cold_bak.sh 执行计划在/var/spool/cron下可以找到 [root@xue cron]# pwd /var/spool/cron [root@xue cron]# ls root [root@xue cron]# cat root 0,15,30,45 * * * 0 /home/backup/cold_bak.sh 或者直接用corntab -l命令查看 [root@ 51itstudy.com ~]# crontab -l 0,15,30,45 * * * 0 /home/backup/cold_bak.sh 11、实验at命令完成自动作业 [root@xue cron]# at *:15 syntax error. Last token seen: * Garbled time [root@xue cron]# at 0:15 at> find / -name "passwd" at> <EOT> job 1 at 2013-12-17 00:15 改命令意思是在次日凌晨15分执行查找passwd文件路径的命令 at -l查看执行计划 [root@xue cron]# at -l 1 2013-12-17 00:15 a root atrm 计划编号 删除指定计划 [root@xue cron]# at -l 1 2013-12-17 00:15 a root [root@xue cron]# atrm 1 [root@xue cron]# at -l 磁盘分区: [root@redhat6-3 ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xce359e4e. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0×0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-261, default 1): (回车,默认将所有空间分配给第一个主分区) Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261): Using default value 261 Command (m for help): t(修改磁盘格式为LVM) Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. 再次查看磁盘情况 [root@redhat6-3 ~]# fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0×00085274 Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 2611 20458496 8e Linux LVM Disk /dev/sdb: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xce359e4e Device Boot Start End Blocks Id System /dev/sdb1 1 261 2096451 8e Linux LVM 12、tar命令解压压缩: tar zcvf 创建压缩文件 tar [-cxtzjvfpPN] 文件与目录 …. 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令 -t :查看 tarfile 里面的文件 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在 因为不可能同时压缩与解压缩。 -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩 -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩 -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程 -f :使用档名,请留意,在 f 之后要立即接档名 -p :使用原文件的原来属性(属性不会依据使用者而变) -P :可以使用绝对路径来压缩! -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中! 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file 如果加 j 参数,则以 .tar.bz2 来作为附档名啊 如把root目录下的内容全部压缩成root.tar.gz [root@xue ~]# tar zcvf ./root.tar.gz ./* 解压[root@xue ~]# tar zcvf ./root.tar.gz ./* 解压root.tar.gz文件 [root@xue ~]# mkdir root [root@xue ~]# tar zxvf root.tar.gz root/ root@xue ~]# cd /root/ [root@xue ~]# ls anaconda-ks.cfg install.log number test test002 Test003 dead.letter install.log.syslog root test001 Test002 test004 Desktop linux root.tar.gz Test001 test003 13、I/O重定向: 输出重定向>(创建)或>>(追加) [root@xue ~]# echo "Hello" > Hello [root@xue ~]# cat Hello Hello [root@xue ~]# echo "Hello" >> Hello [root@xue ~]# echo "Hello" >> Hello [root@xue ~]# cat Hello Hello Hello Hello 使用>&1命令。将stderr和stdout也导入到stdin指定的文件中,及若命令错误,也将重定向到指定文件 如:将TEST命令的错误信息重定向至Hello [root@xue ~]# TEST -bash: TEST: command not found [root@xue ~]# TEST > Hello 2>&1 [root@xue ~]# cat Hello -bash: TEST: command not found 输入重定向: 输入重定向指的是将输入的内容重后面的文件中获取 如: [root@xue ~]# cat < Hello -bash: TEST: command not found |