From b1de2bcba006431520563e6b17910953905dee30 Mon Sep 17 00:00:00 2001 From: black-gold Date: Fri, 9 Nov 2018 12:09:14 +0800 Subject: [PATCH] --- LearnShell/{shelltest.sh => 0Test.sh} | 0 LearnShell/LinuxCommands/ab.md | 2 +- LearnShell/LinuxCommands/alias.md | 224 +- LearnShell/LinuxCommands/apachectl.md | 2 +- LearnShell/LinuxCommands/apropos.md | 2 +- LearnShell/LinuxCommands/apt-get.md | 2 +- LearnShell/LinuxCommands/apt-key.md | 2 +- LearnShell/LinuxCommands/apt-sortpkgs.md | 2 +- LearnShell/LinuxCommands/aptitude.md | 2 +- LearnShell/LinuxCommands/arp.md | 2 +- LearnShell/LinuxCommands/arpd.md | 2 +- LearnShell/LinuxCommands/arping.md | 2 +- LearnShell/LinuxCommands/arptables.md | 2 +- LearnShell/LinuxCommands/arpwatch.md | 2 +- LearnShell/LinuxCommands/atop.md | 0 LearnShell/LinuxCommands/awk.md | 2273 ++++++++++------- LearnShell/LinuxCommands/basename.md | 2 +- LearnShell/LinuxCommands/bc.md | 3 +- LearnShell/LinuxCommands/bind.md | 2 +- LearnShell/LinuxCommands/blkid.md | 2 +- LearnShell/LinuxCommands/cal.md | 2 +- LearnShell/LinuxCommands/cat.md | 2 +- LearnShell/LinuxCommands/cd.md | 2 +- LearnShell/LinuxCommands/chattr.md | 2 +- LearnShell/LinuxCommands/chgrp.md | 104 +- LearnShell/LinuxCommands/chkconfig.md | 158 +- LearnShell/LinuxCommands/chmod.md | 207 +- LearnShell/LinuxCommands/chown.md | 2 +- LearnShell/LinuxCommands/clear.md | 2 +- LearnShell/LinuxCommands/clock.md | 0 LearnShell/LinuxCommands/cp.md | 251 +- LearnShell/LinuxCommands/curl.md | 38 +- LearnShell/LinuxCommands/cut.md | 2 +- LearnShell/LinuxCommands/date.md | 312 +-- LearnShell/LinuxCommands/dd.md | 10 +- LearnShell/LinuxCommands/df.md | 2 +- LearnShell/LinuxCommands/dirname.md | 2 +- LearnShell/LinuxCommands/dmesg.md | 106 +- LearnShell/LinuxCommands/dos2unix.md | 2 +- LearnShell/LinuxCommands/dpkg-deb.md | 2 +- LearnShell/LinuxCommands/dpkg-divert.md | 2 +- LearnShell/LinuxCommands/dpkg-preconfigure.md | 2 +- LearnShell/LinuxCommands/dpkg-query.md | 2 +- LearnShell/LinuxCommands/dpkg-reconfigure.md | 2 +- LearnShell/LinuxCommands/dpkg-split.md | 2 +- LearnShell/LinuxCommands/dpkg-statoverride.md | 2 +- LearnShell/LinuxCommands/dpkg-trigger.md | 2 +- LearnShell/LinuxCommands/dpkg.md | 2 +- LearnShell/LinuxCommands/du.md | 20 +- LearnShell/LinuxCommands/dump.md | 2 +- LearnShell/LinuxCommands/dumpe2fs.md | 0 LearnShell/LinuxCommands/e2fsck.md | 2 +- LearnShell/LinuxCommands/echo.md | 2 +- LearnShell/LinuxCommands/export.md | 2 +- LearnShell/LinuxCommands/expr.md | 59 +- LearnShell/LinuxCommands/fdisk.md | 642 ++--- LearnShell/LinuxCommands/file.md | 2 +- LearnShell/LinuxCommands/find.md | 2033 +++++++++------ LearnShell/LinuxCommands/free.md | 318 +-- LearnShell/LinuxCommands/fsck.ext4.md | 0 LearnShell/LinuxCommands/fsck.md | 2 +- LearnShell/LinuxCommands/git.md | 0 LearnShell/LinuxCommands/grep.md | 615 +++-- LearnShell/LinuxCommands/groupadd.md | 17 +- LearnShell/LinuxCommands/groupdel.md | 4 +- LearnShell/LinuxCommands/groupmod.md | 13 +- LearnShell/LinuxCommands/gunzip.md | 68 +- LearnShell/LinuxCommands/gzip.md | 87 +- LearnShell/LinuxCommands/halt.md | 36 +- LearnShell/LinuxCommands/head.md | 31 +- LearnShell/LinuxCommands/history.md | 67 +- LearnShell/LinuxCommands/htop.md | 130 +- LearnShell/LinuxCommands/hwclock.md | 2 +- LearnShell/LinuxCommands/info.md | 2 +- LearnShell/LinuxCommands/inotifywait.md | 2 +- LearnShell/LinuxCommands/iostat.md | 11 +- LearnShell/LinuxCommands/iotop.md | 2 +- LearnShell/LinuxCommands/ip.md | 242 +- LearnShell/LinuxCommands/ip6tables-restore.md | 2 +- LearnShell/LinuxCommands/ip6tables-save.md | 2 +- LearnShell/LinuxCommands/ip6tables.md | 2 +- LearnShell/LinuxCommands/ipcalc.md | 2 +- LearnShell/LinuxCommands/ipcrm.md | 2 +- LearnShell/LinuxCommands/ipcs.md | 2 +- LearnShell/LinuxCommands/iperf.md | 2 +- LearnShell/LinuxCommands/iptables-restore.md | 2 +- LearnShell/LinuxCommands/iptables-save.md | 2 +- LearnShell/LinuxCommands/iptables.md | 615 ++++- LearnShell/LinuxCommands/iptraf.md | 2 +- LearnShell/LinuxCommands/iptstate.md | 2 +- LearnShell/LinuxCommands/kill.md | 2 +- LearnShell/LinuxCommands/last.md | 2 +- LearnShell/LinuxCommands/less.md | 9 +- LearnShell/LinuxCommands/ln.md | 232 +- LearnShell/LinuxCommands/locale.md | 26 + LearnShell/LinuxCommands/locate.md | 26 +- LearnShell/LinuxCommands/ls.md | 123 +- LearnShell/LinuxCommands/lsb_release.md | 2 + LearnShell/LinuxCommands/lsblk.md | 2 +- LearnShell/LinuxCommands/lsof.md | 2 +- LearnShell/LinuxCommands/man.md | 203 +- LearnShell/LinuxCommands/mkdir.md | 2 +- LearnShell/LinuxCommands/mkfs.md | 2 +- LearnShell/LinuxCommands/mkfs.xfs.md | 0 LearnShell/LinuxCommands/mknod.md | 2 +- LearnShell/LinuxCommands/mkswap.md | 2 +- LearnShell/LinuxCommands/more.md | 2 +- LearnShell/LinuxCommands/mount.md | 11 +- LearnShell/LinuxCommands/mv.md | 108 +- LearnShell/LinuxCommands/nano.md | 2 +- LearnShell/LinuxCommands/netstat.md | 267 +- LearnShell/LinuxCommands/nice.md | 55 +- LearnShell/LinuxCommands/nl.md | 2 +- LearnShell/LinuxCommands/nmap.md | 2 +- LearnShell/LinuxCommands/nmcli.md | 0 LearnShell/LinuxCommands/nslookup.md | 2 +- LearnShell/LinuxCommands/ntpdate.md | 2 +- LearnShell/LinuxCommands/openssl.md | 6 +- LearnShell/LinuxCommands/parted.md | 2 +- LearnShell/LinuxCommands/passwd.md | 29 +- LearnShell/LinuxCommands/patch.md | 2 +- LearnShell/LinuxCommands/pidof.md | 2 +- LearnShell/LinuxCommands/ping.md | 2 +- LearnShell/LinuxCommands/poweroff.md | 0 LearnShell/LinuxCommands/ps.md | 207 +- LearnShell/LinuxCommands/pstree.md | 116 +- LearnShell/LinuxCommands/pwd.md | 2 +- LearnShell/LinuxCommands/reboot.md | 2 +- LearnShell/LinuxCommands/renamemd.sh | 9 + LearnShell/LinuxCommands/renice.md | 2 +- LearnShell/LinuxCommands/rm.md | 40 +- LearnShell/LinuxCommands/rpm.md | 2 +- LearnShell/LinuxCommands/rsync.md | 2 +- LearnShell/LinuxCommands/sed.md | 558 +++- LearnShell/LinuxCommands/sendmail.md | 2 +- LearnShell/LinuxCommands/seq.md | 2 +- LearnShell/LinuxCommands/service.md | 2 +- LearnShell/LinuxCommands/set.md | 2 +- LearnShell/LinuxCommands/sh.md | 2 +- LearnShell/LinuxCommands/shutdown.md | 2 +- LearnShell/LinuxCommands/sort.md | 4 +- LearnShell/LinuxCommands/source.md | 0 LearnShell/LinuxCommands/ssh-add.md | 2 +- LearnShell/LinuxCommands/ssh-agent.md | 2 +- LearnShell/LinuxCommands/ssh-copy-id.md | 2 +- LearnShell/LinuxCommands/ssh-keygen.md | 25 + LearnShell/LinuxCommands/ssh-keyscan.md | 2 +- LearnShell/LinuxCommands/ssh.md | 320 ++- LearnShell/LinuxCommands/sshd.md | 2 +- LearnShell/LinuxCommands/su.md | 2 +- LearnShell/LinuxCommands/sudo.md | 25 +- LearnShell/LinuxCommands/swapon.md | 2 +- LearnShell/LinuxCommands/sync.md | 2 +- LearnShell/LinuxCommands/systemctl.md | 164 ++ LearnShell/LinuxCommands/tac.md | 2 +- LearnShell/LinuxCommands/tail.md | 94 +- LearnShell/LinuxCommands/tailf.md | 0 LearnShell/LinuxCommands/tar.md | 456 ++-- LearnShell/LinuxCommands/tcpdump.md | 330 +-- LearnShell/LinuxCommands/tcpreplay.md | 2 +- LearnShell/LinuxCommands/telnet.md | 274 +- LearnShell/LinuxCommands/time.md | 2 +- LearnShell/LinuxCommands/top.md | 1 + LearnShell/LinuxCommands/touch.md | 2 +- LearnShell/LinuxCommands/tune2fs.md | 0 LearnShell/LinuxCommands/ulimit.md | 2 +- LearnShell/LinuxCommands/umask.md | 3 + LearnShell/LinuxCommands/umount.md | 2 +- LearnShell/LinuxCommands/uname.md | 2 +- LearnShell/LinuxCommands/uniq.md | 2 +- LearnShell/LinuxCommands/unzip.md | 2 +- LearnShell/LinuxCommands/uptime.md | 2 +- LearnShell/LinuxCommands/useradd.md | 45 +- LearnShell/LinuxCommands/userdel.md | 2 +- LearnShell/LinuxCommands/usermod.md | 40 +- LearnShell/LinuxCommands/users.md | 2 +- LearnShell/LinuxCommands/vi.md | 2 +- LearnShell/LinuxCommands/vmstat.md | 6 + LearnShell/LinuxCommands/w.md | 18 +- LearnShell/LinuxCommands/wall.md | 9 +- LearnShell/LinuxCommands/watch.md | 98 +- LearnShell/LinuxCommands/wc.md | 134 +- LearnShell/LinuxCommands/wget.md | 144 +- LearnShell/LinuxCommands/whatis.md | 2 +- LearnShell/LinuxCommands/whereis.md | 2 +- LearnShell/LinuxCommands/which.md | 102 +- LearnShell/LinuxCommands/who.md | 2 +- LearnShell/LinuxCommands/whoami.md | 2 +- LearnShell/LinuxCommands/xargs.md | 389 +-- LearnShell/LinuxCommands/xfs_admin.md | 0 LearnShell/LinuxCommands/xfs_info.md | 0 LearnShell/LinuxCommands/xfs_repair.md | 0 LearnShell/LinuxCommands/xfsdump.md | 0 LearnShell/LinuxCommands/xfsrestore.md | 0 LearnShell/LinuxCommands/xz.md | 0 LearnShell/LinuxCommands/yum.md | 212 +- LearnShell/LinuxCommands/zcat.md | 2 +- LearnShell/LinuxCommands/zip.md | 188 +- LearnShell/LinuxCommands/zipinfo.md | 2 +- 199 files changed, 8018 insertions(+), 6006 deletions(-) rename LearnShell/{shelltest.sh => 0Test.sh} (100%) mode change 100644 => 100755 LearnShell/LinuxCommands/ab.md mode change 100644 => 100755 LearnShell/LinuxCommands/alias.md mode change 100644 => 100755 LearnShell/LinuxCommands/apachectl.md mode change 100644 => 100755 LearnShell/LinuxCommands/apropos.md mode change 100644 => 100755 LearnShell/LinuxCommands/apt-get.md mode change 100644 => 100755 LearnShell/LinuxCommands/apt-key.md mode change 100644 => 100755 LearnShell/LinuxCommands/apt-sortpkgs.md mode change 100644 => 100755 LearnShell/LinuxCommands/aptitude.md mode change 100644 => 100755 LearnShell/LinuxCommands/arp.md mode change 100644 => 100755 LearnShell/LinuxCommands/arpd.md mode change 100644 => 100755 LearnShell/LinuxCommands/arping.md mode change 100644 => 100755 LearnShell/LinuxCommands/arptables.md mode change 100644 => 100755 LearnShell/LinuxCommands/arpwatch.md mode change 100644 => 100755 LearnShell/LinuxCommands/atop.md mode change 100644 => 100755 LearnShell/LinuxCommands/awk.md mode change 100644 => 100755 LearnShell/LinuxCommands/basename.md mode change 100644 => 100755 LearnShell/LinuxCommands/bc.md mode change 100644 => 100755 LearnShell/LinuxCommands/bind.md mode change 100644 => 100755 LearnShell/LinuxCommands/blkid.md mode change 100644 => 100755 LearnShell/LinuxCommands/cal.md mode change 100644 => 100755 LearnShell/LinuxCommands/cat.md mode change 100644 => 100755 LearnShell/LinuxCommands/cd.md mode change 100644 => 100755 LearnShell/LinuxCommands/chattr.md mode change 100644 => 100755 LearnShell/LinuxCommands/chgrp.md mode change 100644 => 100755 LearnShell/LinuxCommands/chkconfig.md mode change 100644 => 100755 LearnShell/LinuxCommands/chmod.md mode change 100644 => 100755 LearnShell/LinuxCommands/chown.md mode change 100644 => 100755 LearnShell/LinuxCommands/clear.md mode change 100644 => 100755 LearnShell/LinuxCommands/clock.md mode change 100644 => 100755 LearnShell/LinuxCommands/cp.md mode change 100644 => 100755 LearnShell/LinuxCommands/curl.md mode change 100644 => 100755 LearnShell/LinuxCommands/cut.md mode change 100644 => 100755 LearnShell/LinuxCommands/date.md mode change 100644 => 100755 LearnShell/LinuxCommands/dd.md mode change 100644 => 100755 LearnShell/LinuxCommands/df.md mode change 100644 => 100755 LearnShell/LinuxCommands/dirname.md mode change 100644 => 100755 LearnShell/LinuxCommands/dmesg.md mode change 100644 => 100755 LearnShell/LinuxCommands/dos2unix.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-deb.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-divert.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-preconfigure.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-query.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-reconfigure.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-split.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-statoverride.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg-trigger.md mode change 100644 => 100755 LearnShell/LinuxCommands/dpkg.md mode change 100644 => 100755 LearnShell/LinuxCommands/du.md mode change 100644 => 100755 LearnShell/LinuxCommands/dump.md create mode 100755 LearnShell/LinuxCommands/dumpe2fs.md mode change 100644 => 100755 LearnShell/LinuxCommands/e2fsck.md mode change 100644 => 100755 LearnShell/LinuxCommands/echo.md mode change 100644 => 100755 LearnShell/LinuxCommands/export.md mode change 100644 => 100755 LearnShell/LinuxCommands/expr.md mode change 100644 => 100755 LearnShell/LinuxCommands/fdisk.md mode change 100644 => 100755 LearnShell/LinuxCommands/file.md mode change 100644 => 100755 LearnShell/LinuxCommands/find.md mode change 100644 => 100755 LearnShell/LinuxCommands/free.md create mode 100755 LearnShell/LinuxCommands/fsck.ext4.md mode change 100644 => 100755 LearnShell/LinuxCommands/fsck.md mode change 100644 => 100755 LearnShell/LinuxCommands/git.md mode change 100644 => 100755 LearnShell/LinuxCommands/grep.md mode change 100644 => 100755 LearnShell/LinuxCommands/groupadd.md mode change 100644 => 100755 LearnShell/LinuxCommands/groupdel.md mode change 100644 => 100755 LearnShell/LinuxCommands/groupmod.md mode change 100644 => 100755 LearnShell/LinuxCommands/gunzip.md mode change 100644 => 100755 LearnShell/LinuxCommands/gzip.md mode change 100644 => 100755 LearnShell/LinuxCommands/halt.md mode change 100644 => 100755 LearnShell/LinuxCommands/head.md mode change 100644 => 100755 LearnShell/LinuxCommands/history.md mode change 100644 => 100755 LearnShell/LinuxCommands/htop.md mode change 100644 => 100755 LearnShell/LinuxCommands/hwclock.md mode change 100644 => 100755 LearnShell/LinuxCommands/info.md mode change 100644 => 100755 LearnShell/LinuxCommands/inotifywait.md mode change 100644 => 100755 LearnShell/LinuxCommands/iostat.md mode change 100644 => 100755 LearnShell/LinuxCommands/iotop.md mode change 100644 => 100755 LearnShell/LinuxCommands/ip.md mode change 100644 => 100755 LearnShell/LinuxCommands/ip6tables-restore.md mode change 100644 => 100755 LearnShell/LinuxCommands/ip6tables-save.md mode change 100644 => 100755 LearnShell/LinuxCommands/ip6tables.md mode change 100644 => 100755 LearnShell/LinuxCommands/ipcalc.md mode change 100644 => 100755 LearnShell/LinuxCommands/ipcrm.md mode change 100644 => 100755 LearnShell/LinuxCommands/ipcs.md mode change 100644 => 100755 LearnShell/LinuxCommands/iperf.md mode change 100644 => 100755 LearnShell/LinuxCommands/iptables-restore.md mode change 100644 => 100755 LearnShell/LinuxCommands/iptables-save.md mode change 100644 => 100755 LearnShell/LinuxCommands/iptables.md mode change 100644 => 100755 LearnShell/LinuxCommands/iptraf.md mode change 100644 => 100755 LearnShell/LinuxCommands/iptstate.md mode change 100644 => 100755 LearnShell/LinuxCommands/kill.md mode change 100644 => 100755 LearnShell/LinuxCommands/last.md mode change 100644 => 100755 LearnShell/LinuxCommands/less.md mode change 100644 => 100755 LearnShell/LinuxCommands/ln.md create mode 100755 LearnShell/LinuxCommands/locale.md mode change 100644 => 100755 LearnShell/LinuxCommands/locate.md mode change 100644 => 100755 LearnShell/LinuxCommands/ls.md mode change 100644 => 100755 LearnShell/LinuxCommands/lsb_release.md mode change 100644 => 100755 LearnShell/LinuxCommands/lsblk.md mode change 100644 => 100755 LearnShell/LinuxCommands/lsof.md mode change 100644 => 100755 LearnShell/LinuxCommands/man.md mode change 100644 => 100755 LearnShell/LinuxCommands/mkdir.md mode change 100644 => 100755 LearnShell/LinuxCommands/mkfs.md create mode 100755 LearnShell/LinuxCommands/mkfs.xfs.md mode change 100644 => 100755 LearnShell/LinuxCommands/mknod.md mode change 100644 => 100755 LearnShell/LinuxCommands/mkswap.md mode change 100644 => 100755 LearnShell/LinuxCommands/more.md mode change 100644 => 100755 LearnShell/LinuxCommands/mount.md mode change 100644 => 100755 LearnShell/LinuxCommands/mv.md mode change 100644 => 100755 LearnShell/LinuxCommands/nano.md mode change 100644 => 100755 LearnShell/LinuxCommands/netstat.md mode change 100644 => 100755 LearnShell/LinuxCommands/nice.md mode change 100644 => 100755 LearnShell/LinuxCommands/nl.md mode change 100644 => 100755 LearnShell/LinuxCommands/nmap.md mode change 100644 => 100755 LearnShell/LinuxCommands/nmcli.md mode change 100644 => 100755 LearnShell/LinuxCommands/nslookup.md mode change 100644 => 100755 LearnShell/LinuxCommands/ntpdate.md mode change 100644 => 100755 LearnShell/LinuxCommands/openssl.md mode change 100644 => 100755 LearnShell/LinuxCommands/parted.md mode change 100644 => 100755 LearnShell/LinuxCommands/passwd.md mode change 100644 => 100755 LearnShell/LinuxCommands/patch.md mode change 100644 => 100755 LearnShell/LinuxCommands/pidof.md mode change 100644 => 100755 LearnShell/LinuxCommands/ping.md mode change 100644 => 100755 LearnShell/LinuxCommands/poweroff.md mode change 100644 => 100755 LearnShell/LinuxCommands/ps.md mode change 100644 => 100755 LearnShell/LinuxCommands/pstree.md mode change 100644 => 100755 LearnShell/LinuxCommands/pwd.md mode change 100644 => 100755 LearnShell/LinuxCommands/reboot.md create mode 100755 LearnShell/LinuxCommands/renamemd.sh mode change 100644 => 100755 LearnShell/LinuxCommands/renice.md mode change 100644 => 100755 LearnShell/LinuxCommands/rm.md mode change 100644 => 100755 LearnShell/LinuxCommands/rpm.md mode change 100644 => 100755 LearnShell/LinuxCommands/rsync.md mode change 100644 => 100755 LearnShell/LinuxCommands/sed.md mode change 100644 => 100755 LearnShell/LinuxCommands/sendmail.md mode change 100644 => 100755 LearnShell/LinuxCommands/seq.md mode change 100644 => 100755 LearnShell/LinuxCommands/service.md mode change 100644 => 100755 LearnShell/LinuxCommands/set.md mode change 100644 => 100755 LearnShell/LinuxCommands/sh.md mode change 100644 => 100755 LearnShell/LinuxCommands/shutdown.md mode change 100644 => 100755 LearnShell/LinuxCommands/sort.md mode change 100644 => 100755 LearnShell/LinuxCommands/source.md mode change 100644 => 100755 LearnShell/LinuxCommands/ssh-add.md mode change 100644 => 100755 LearnShell/LinuxCommands/ssh-agent.md mode change 100644 => 100755 LearnShell/LinuxCommands/ssh-copy-id.md mode change 100644 => 100755 LearnShell/LinuxCommands/ssh-keygen.md mode change 100644 => 100755 LearnShell/LinuxCommands/ssh-keyscan.md mode change 100644 => 100755 LearnShell/LinuxCommands/ssh.md mode change 100644 => 100755 LearnShell/LinuxCommands/sshd.md mode change 100644 => 100755 LearnShell/LinuxCommands/su.md mode change 100644 => 100755 LearnShell/LinuxCommands/sudo.md mode change 100644 => 100755 LearnShell/LinuxCommands/swapon.md mode change 100644 => 100755 LearnShell/LinuxCommands/sync.md mode change 100644 => 100755 LearnShell/LinuxCommands/systemctl.md mode change 100644 => 100755 LearnShell/LinuxCommands/tac.md mode change 100644 => 100755 LearnShell/LinuxCommands/tail.md mode change 100644 => 100755 LearnShell/LinuxCommands/tailf.md mode change 100644 => 100755 LearnShell/LinuxCommands/tar.md mode change 100644 => 100755 LearnShell/LinuxCommands/tcpdump.md mode change 100644 => 100755 LearnShell/LinuxCommands/tcpreplay.md mode change 100644 => 100755 LearnShell/LinuxCommands/telnet.md mode change 100644 => 100755 LearnShell/LinuxCommands/time.md mode change 100644 => 100755 LearnShell/LinuxCommands/top.md mode change 100644 => 100755 LearnShell/LinuxCommands/touch.md create mode 100755 LearnShell/LinuxCommands/tune2fs.md mode change 100644 => 100755 LearnShell/LinuxCommands/ulimit.md mode change 100644 => 100755 LearnShell/LinuxCommands/umask.md mode change 100644 => 100755 LearnShell/LinuxCommands/umount.md mode change 100644 => 100755 LearnShell/LinuxCommands/uname.md mode change 100644 => 100755 LearnShell/LinuxCommands/uniq.md mode change 100644 => 100755 LearnShell/LinuxCommands/unzip.md mode change 100644 => 100755 LearnShell/LinuxCommands/uptime.md mode change 100644 => 100755 LearnShell/LinuxCommands/useradd.md mode change 100644 => 100755 LearnShell/LinuxCommands/userdel.md mode change 100644 => 100755 LearnShell/LinuxCommands/usermod.md mode change 100644 => 100755 LearnShell/LinuxCommands/users.md mode change 100644 => 100755 LearnShell/LinuxCommands/vi.md mode change 100644 => 100755 LearnShell/LinuxCommands/vmstat.md mode change 100644 => 100755 LearnShell/LinuxCommands/w.md mode change 100644 => 100755 LearnShell/LinuxCommands/wall.md mode change 100644 => 100755 LearnShell/LinuxCommands/watch.md mode change 100644 => 100755 LearnShell/LinuxCommands/wc.md mode change 100644 => 100755 LearnShell/LinuxCommands/wget.md mode change 100644 => 100755 LearnShell/LinuxCommands/whatis.md mode change 100644 => 100755 LearnShell/LinuxCommands/whereis.md mode change 100644 => 100755 LearnShell/LinuxCommands/which.md mode change 100644 => 100755 LearnShell/LinuxCommands/who.md mode change 100644 => 100755 LearnShell/LinuxCommands/whoami.md mode change 100644 => 100755 LearnShell/LinuxCommands/xargs.md create mode 100755 LearnShell/LinuxCommands/xfs_admin.md create mode 100755 LearnShell/LinuxCommands/xfs_info.md create mode 100755 LearnShell/LinuxCommands/xfs_repair.md create mode 100755 LearnShell/LinuxCommands/xfsdump.md create mode 100755 LearnShell/LinuxCommands/xfsrestore.md mode change 100644 => 100755 LearnShell/LinuxCommands/xz.md mode change 100644 => 100755 LearnShell/LinuxCommands/yum.md mode change 100644 => 100755 LearnShell/LinuxCommands/zcat.md mode change 100644 => 100755 LearnShell/LinuxCommands/zip.md mode change 100644 => 100755 LearnShell/LinuxCommands/zipinfo.md diff --git a/LearnShell/shelltest.sh b/LearnShell/0Test.sh similarity index 100% rename from LearnShell/shelltest.sh rename to LearnShell/0Test.sh diff --git a/LearnShell/LinuxCommands/ab.md b/LearnShell/LinuxCommands/ab.md old mode 100644 new mode 100755 index 898838d..816844c --- a/LearnShell/LinuxCommands/ab.md +++ b/LearnShell/LinuxCommands/ab.md @@ -1,6 +1,6 @@ ab === - + Apache服务器的性能测试工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/alias.md b/LearnShell/LinuxCommands/alias.md old mode 100644 new mode 100755 index f0ce496..9786047 --- a/LearnShell/LinuxCommands/alias.md +++ b/LearnShell/LinuxCommands/alias.md @@ -1,112 +1,112 @@ -alias -=== - -用来设置指令的别名 - -## 补充说明 - -**alias命令** 用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号`''`将原来的命令引起来,防止特殊字符导致错误。 - -alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件`/etc/bashrc`中。 - -### 语法 - -``` -alias(选项)(参数) -``` - -### 选项 - -``` --p:打印已经设置的命令别名。 -``` - -### 参数 - -命令别名设置:定义命令别名,格式为“命令别名=‘实际命令’”。 - -### 实例 - - **alias 的基本使用方法为:** - -``` -alias 新的命令='原命令 -选项/参数' -``` - -例如:`alias l=‘ls -lsh'`将重新定义ls命令,现在只需输入l就可以列目录了。直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。 - -要删除一个别名,可以使用 unalias 命令,如 unalias l。 - - **查看系统已经设置的别名:** - -```bash -[root@localhost ~]# -[root@localhost ~]# alias -alias cp='cp -i' -alias egrep='egrep --color=auto' -alias fgrep='fgrep --color=auto' -alias grep='grep --color=auto' -alias l.='ls -d .* --color=auto' -alias ll='ls -l --color=auto' -alias ls='ls --color=auto' -alias mv='mv -i' -alias rm='rm -i' -alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' -[root@localhost ~]# - -``` -### 命令别名永久生效 -直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢?办法就是将别名的设置加入~/.bashrc文件,然后重新载入下文件就可以了。 -```bash -$ vim ~/.bashrc -``` -在文件最后面加入别名设置,如:alias rm=’rm -i’,保存后重新载入: -```bash -$ source ~/.bashrc -``` -这样就可以永久保存命令的别名了。因为修改的是当前用户目录下的.bashrc文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改/etc目录下的bashrc文件就可以了。在CentOS7下,这个文件是/etc/bash.bashrc。此外在CentOS7下,细看~/.bashrc文件,会发有这样一段代码: -```bash -if [ -f ~/.bash_aliases ]; then - . ~/.bash_aliases -fi -``` - -这个代码的意思就是加载.bash_aliases文件,CentOS7已经帮我们考虑好了,所以也可以在用户根目录下新建一个文件.bash_aliases存放命令别名设置。 - -### 小结 - -alias这个命令是shell的内建命令,可以根据自己的使用习惯设置一些别名,需要注意的就是和其他命令冲突的情况。 - - - - -#### 一、 范例演示 - -在使用和维护Linux系统过程中,我们常常希望根据自己的需要来定义一些命令,那么这样的操作是不是很难呢?其实不是,系统已经为我们设置好了相关的命令,下面小编就以CentOS6.4系统为例,为大家演示如何创建自己的命令。 - -#### 二、 自定义命令简介 - CentOS系统下的创建自定义命令其实比较简单,使用的命令就是alias,具体使用的方法就是 alias 自定义命令名=‘命令’。但是需要注意的是,在自定义之前需要查看自定义的命令名是否是系统已经使用的命令名,否则会冲突,另外一个就是定期清理不需要的自定义命令名。 - - -#### 三、 演示举例 -假定系统操作员希望进行如下操作: -1.进入目录/root -2.查看目录下文件 -3.切换回根目录 -通常这需要三条命令 cd /root;ls;cd / ,如果需要经常使用那么我们可以通过自定义命令的方式用一条命令完成全部操作。 -![](alias\01.png) - -#### 四、 操作过程 - 首先使用命令 type 自定义命令名 ,查看自定义命令名是否被系统占用。从图中可以看出test命令名已被系统占用,所以不能使用,而loo这个命令名经查询可以使用。 -![](alias\02.png) - - 使用命令alias创建自定义命令:alias loo='cd /root;ls;cd /' 。需要注意的是命令的使用格式,分号与分号之间是没有空格的。 -![](alias\03.png) - - 测试一下自定义命令,当输入命令 loo 时,发现系统依次完成了 cd /root、ls、cd / 三条命令,说明设置成功。同时也可直接使用命令 alias 查询系统中是否添加了loo这个自定义命令。 -![](alias\04.png) - - 如果希望删除这个自定义命令,可以使用命令 unalias 自定义命令名 来完成。执行之后发现,loo命令已不存在,同时自定义命令库中也没有loo命令。 -![](alias\05.png) - - +alias +=== + +用来设置指令的别名 + +## 补充说明 + +**alias命令** 用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号`''`将原来的命令引起来,防止特殊字符导致错误。 + +alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件`/etc/bashrc`中。 + +### 语法 + +``` +alias(选项)(参数) +``` + +### 选项 + +``` +-p:打印已经设置的命令别名。 +``` + +### 参数 + +命令别名设置:定义命令别名,格式为“命令别名=‘实际命令’”。 + +### 实例 + + **alias 的基本使用方法为:** + +``` +alias 新的命令='原命令 -选项/参数' +``` + +例如:`alias l=‘ls -lsh'`将重新定义ls命令,现在只需输入l就可以列目录了。直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。 + +要删除一个别名,可以使用 unalias 命令,如 unalias l。 + + **查看系统已经设置的别名:** + +```bash +[root@localhost ~]# +[root@localhost ~]# alias +alias cp='cp -i' +alias egrep='egrep --color=auto' +alias fgrep='fgrep --color=auto' +alias grep='grep --color=auto' +alias l.='ls -d .* --color=auto' +alias ll='ls -l --color=auto' +alias ls='ls --color=auto' +alias mv='mv -i' +alias rm='rm -i' +alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' +[root@localhost ~]# + +``` +### 命令别名永久生效 +直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢?办法就是将别名的设置加入~/.bashrc文件,然后重新载入下文件就可以了。 +```bash +$ vim ~/.bashrc +``` +在文件最后面加入别名设置,如:alias rm=’rm -i’,保存后重新载入: +```bash +$ source ~/.bashrc +``` +这样就可以永久保存命令的别名了。因为修改的是当前用户目录下的.bashrc文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改/etc目录下的bashrc文件就可以了。在CentOS7下,这个文件是/etc/bash.bashrc。此外在CentOS7下,细看~/.bashrc文件,会发有这样一段代码: +```bash +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi +``` + +这个代码的意思就是加载.bash_aliases文件,CentOS7已经帮我们考虑好了,所以也可以在用户根目录下新建一个文件.bash_aliases存放命令别名设置。 + +### 小结 + +alias这个命令是shell的内建命令,可以根据自己的使用习惯设置一些别名,需要注意的就是和其他命令冲突的情况。 + + + + +#### 一、 范例演示 + +在使用和维护Linux系统过程中,我们常常希望根据自己的需要来定义一些命令,那么这样的操作是不是很难呢?其实不是,系统已经为我们设置好了相关的命令,下面小编就以CentOS6.4系统为例,为大家演示如何创建自己的命令。 + +#### 二、 自定义命令简介 + CentOS系统下的创建自定义命令其实比较简单,使用的命令就是alias,具体使用的方法就是 alias 自定义命令名=‘命令’。但是需要注意的是,在自定义之前需要查看自定义的命令名是否是系统已经使用的命令名,否则会冲突,另外一个就是定期清理不需要的自定义命令名。 + + +#### 三、 演示举例 +假定系统操作员希望进行如下操作: +1.进入目录/root +2.查看目录下文件 +3.切换回根目录 +通常这需要三条命令 cd /root;ls;cd / ,如果需要经常使用那么我们可以通过自定义命令的方式用一条命令完成全部操作。 +![](alias\01.png) + +#### 四、 操作过程 + 首先使用命令 type 自定义命令名 ,查看自定义命令名是否被系统占用。从图中可以看出test命令名已被系统占用,所以不能使用,而loo这个命令名经查询可以使用。 +![](alias\02.png) + + 使用命令alias创建自定义命令:alias loo='cd /root;ls;cd /' 。需要注意的是命令的使用格式,分号与分号之间是没有空格的。 +![](alias\03.png) + + 测试一下自定义命令,当输入命令 loo 时,发现系统依次完成了 cd /root、ls、cd / 三条命令,说明设置成功。同时也可直接使用命令 alias 查询系统中是否添加了loo这个自定义命令。 +![](alias\04.png) + + 如果希望删除这个自定义命令,可以使用命令 unalias 自定义命令名 来完成。执行之后发现,loo命令已不存在,同时自定义命令库中也没有loo命令。 +![](alias\05.png) + + diff --git a/LearnShell/LinuxCommands/apachectl.md b/LearnShell/LinuxCommands/apachectl.md old mode 100644 new mode 100755 index bd47688..9656af2 --- a/LearnShell/LinuxCommands/apachectl.md +++ b/LearnShell/LinuxCommands/apachectl.md @@ -1,6 +1,6 @@ apachectl === - + Apache服务器前端控制工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/apropos.md b/LearnShell/LinuxCommands/apropos.md old mode 100644 new mode 100755 index 41928a8..b4bcd87 --- a/LearnShell/LinuxCommands/apropos.md +++ b/LearnShell/LinuxCommands/apropos.md @@ -1,6 +1,6 @@ apropos === - + 在 whatis 数据库中查找字符串 ## 补充说明 diff --git a/LearnShell/LinuxCommands/apt-get.md b/LearnShell/LinuxCommands/apt-get.md old mode 100644 new mode 100755 index 9a4d9da..95a4e3a --- a/LearnShell/LinuxCommands/apt-get.md +++ b/LearnShell/LinuxCommands/apt-get.md @@ -1,6 +1,6 @@ apt-get === - + Debian Linux发行版中的APT软件包管理工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/apt-key.md b/LearnShell/LinuxCommands/apt-key.md old mode 100644 new mode 100755 index 29123f3..64766cb --- a/LearnShell/LinuxCommands/apt-key.md +++ b/LearnShell/LinuxCommands/apt-key.md @@ -1,6 +1,6 @@ apt-key === - + 管理Debian Linux系统中的软件包密钥 ## 补充说明 diff --git a/LearnShell/LinuxCommands/apt-sortpkgs.md b/LearnShell/LinuxCommands/apt-sortpkgs.md old mode 100644 new mode 100755 index e65f684..f9d2416 --- a/LearnShell/LinuxCommands/apt-sortpkgs.md +++ b/LearnShell/LinuxCommands/apt-sortpkgs.md @@ -1,6 +1,6 @@ apt-sortpkgs === - + Debian Linux下对软件包索引文件进行排序的工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/aptitude.md b/LearnShell/LinuxCommands/aptitude.md old mode 100644 new mode 100755 index f4176b1..378997d --- a/LearnShell/LinuxCommands/aptitude.md +++ b/LearnShell/LinuxCommands/aptitude.md @@ -1,6 +1,6 @@ aptitude === - + Debian Linux系统中软件包管理工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/arp.md b/LearnShell/LinuxCommands/arp.md old mode 100644 new mode 100755 index 84b6fd9..222729c --- a/LearnShell/LinuxCommands/arp.md +++ b/LearnShell/LinuxCommands/arp.md @@ -1,6 +1,6 @@ arp === - + 显示和修改IP到MAC转换表 ## 补充说明 diff --git a/LearnShell/LinuxCommands/arpd.md b/LearnShell/LinuxCommands/arpd.md old mode 100644 new mode 100755 index 867b866..35e2dc5 --- a/LearnShell/LinuxCommands/arpd.md +++ b/LearnShell/LinuxCommands/arpd.md @@ -1,6 +1,6 @@ arpd === - + 收集免费ARP信息 ## 补充说明 diff --git a/LearnShell/LinuxCommands/arping.md b/LearnShell/LinuxCommands/arping.md old mode 100644 new mode 100755 index f933c9e..3494228 --- a/LearnShell/LinuxCommands/arping.md +++ b/LearnShell/LinuxCommands/arping.md @@ -1,6 +1,6 @@ arping === - + 通过发送ARP协议报文测试网络 ## 补充说明 diff --git a/LearnShell/LinuxCommands/arptables.md b/LearnShell/LinuxCommands/arptables.md old mode 100644 new mode 100755 index 42f6ea8..56c137b --- a/LearnShell/LinuxCommands/arptables.md +++ b/LearnShell/LinuxCommands/arptables.md @@ -1,6 +1,6 @@ arptables === - + 管理ARP包过滤规则表 ## 补充说明 diff --git a/LearnShell/LinuxCommands/arpwatch.md b/LearnShell/LinuxCommands/arpwatch.md old mode 100644 new mode 100755 index 9b1de0f..c3fb1a2 --- a/LearnShell/LinuxCommands/arpwatch.md +++ b/LearnShell/LinuxCommands/arpwatch.md @@ -1,6 +1,6 @@ arpwatch === - + 监听网络上ARP的记录 ## 补充说明 diff --git a/LearnShell/LinuxCommands/atop.md b/LearnShell/LinuxCommands/atop.md old mode 100644 new mode 100755 diff --git a/LearnShell/LinuxCommands/awk.md b/LearnShell/LinuxCommands/awk.md old mode 100644 new mode 100755 index 6a5a392..c5543a1 --- a/LearnShell/LinuxCommands/awk.md +++ b/LearnShell/LinuxCommands/awk.md @@ -1,951 +1,1322 @@ -awk -=== - -文本和数据进行处理的编程语言 - -## 补充说明 - -**awk** 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。 - -## awk命令格式和选项 - - **语法形式** - -``` -awk [options] 'script' var=value file(s) -awk [options] -f scriptfile var=value file(s) -``` - - **常用命令选项** - -* **-F fs   ** fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -* **-v var=value   ** 赋值一个用户定义变量,将外部变量传递给awk -* **-f scripfile  ** 从脚本文件中读取awk命令 -* **-m[fr] val   ** 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 - -## awk模式和操作 - -awk脚本是由模式和操作组成的。 - -### 模式 - -模式可以是以下任意一个: - -* /正则表达式/:使用通配符的扩展集。 -* 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 -* 模式匹配表达式:用运算符`~`(匹配)和`!~`(不匹配)。 -* BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理 - -### 操作 - -操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是: - -* 变量或数组赋值 -* 输出命令 -* 内置函数 -* 控制流语句 - -## awk脚本基本结构 - -``` -awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file -``` - -一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 **单引号** 或 **双引号** 中,例如: - -``` -awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename -awk "BEGIN{ i=0 } { i++ } END{ print i }" filename -``` - -### awk的工作原理 - -``` -awk 'BEGIN{ commands } pattern{ commands } END{ commands }' -``` - -* 第一步:执行`BEGIN{ commands }`语句块中的语句; -* 第二步:从文件或标准输入(stdin)读取一行,然后执行`pattern{ commands }`语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 -* 第三步:当读至输入流末尾时,执行`END{ commands }`语句块。 - - **BEGIN语句块** 在awk开始从输入流中读取行 **之前** 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 - - **END语句块** 在awk从输入流中读取完所有的行 **之后** 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 - - **pattern语句块** 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行`{ print }`,即打印每一个读取到的行,awk读取的每一行都会执行该语句块。 - - **示例** - -``` -echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' -Start -A line 1 -A line 2 -End -``` - -当使用不带参数的`print`时,它就打印当前行,当`print`的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如: - -``` -echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' -v1 v2 v3 -``` - -双引号拼接使用: - -``` -echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' -v1=v2=v3 -``` - -{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。 - -## awk内置变量(预定义变量) - -说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk - -``` - **$n** 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 - **$0** 这个变量包含执行过程中当前行的文本内容。 -[N] **ARGC** 命令行参数的数目。 -[G] **ARGIND** 命令行中当前文件的位置(从0开始算)。 -[N] **ARGV** 包含命令行参数的数组。 -[G] **CONVFMT** 数字转换格式(默认值为%.6g)。 -[P] **ENVIRON** 环境变量关联数组。 -[N] **ERRNO** 最后一个系统错误的描述。 -[G] **FIELDWIDTHS** 字段宽度列表(用空格键分隔)。 -[A] **FILENAME** 当前输入文件的名。 -[P] **FNR** 同NR,但相对于当前文件。 -[A] **FS** 字段分隔符(默认是任何空格)。 -[G] **IGNORECASE** 如果为真,则进行忽略大小写的匹配。 -[A] **NF** 表示字段数,在执行过程中对应于当前的字段数。 -[A] **NR** 表示记录数,在执行过程中对应于当前的行号。 -[A] **OFMT** 数字的输出格式(默认值是%.6g)。 -[A] **OFS** 输出字段分隔符(默认值是一个空格)。 -[A] **ORS** 输出记录分隔符(默认值是一个换行符)。 -[A] **RS** 记录分隔符(默认是一个换行符)。 -[N] **RSTART** 由match函数所匹配的字符串的第一个位置。 -[N] **RLENGTH** 由match函数所匹配的字符串的长度。 -[N] **SUBSEP** 数组下标分隔符(默认值是34)。 -``` - - **示例** - -``` -echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' -Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 -Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 -Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7 -``` - -使用`print $NF`可以打印出一行中的最后一个字段,使用`$(NF-1)`则是打印倒数第二个字段,其他以此类推: - -``` -echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}' -f3 -f5 -``` - -``` -echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}' -f2 -f4 - -``` - -打印每一行的第二和第三个字段: - -``` -awk '{ print $2,$3 }' filename -``` - -统计文件中的行数: - -``` -awk 'END{ print NR }' filename -``` - -以上命令只使用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数。 - -一个每一行中第一个字段值累加的例子: - -``` -seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' -总和: -1+ -2+ -3+ -4+ -5+ -等于 -15 -``` - -## 将外部变量值传递给awk - -借助 **`-v`选项** ,可以将外部值(并非来自stdin)传递给awk: - -``` -VAR=10000 -echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' -``` - -另一种传递外部变量方法: - -``` -var1="aaa" -var2="bbb" -echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 -``` - -当输入来自于文件时使用: - -``` -awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename -``` - -以上方法中,变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。 - -## 查找进程pid - -``` -netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' -``` - -## awk运算与判断 - -作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和!~(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。 - -### 算术运算符 - -| 运算符 | 描述 | -| ----- | ---- | -| + - | 加,减 | -| * / & | 乘,除与求余 | -| + - ! | 一元加,减和逻辑非 | -| ^ *** | 求幂 | -| ++ -- | 增加或减少,作为前缀或后缀 | - -例: - -``` -awk 'BEGIN{a="b";print a++,++a;}' -0 2 -``` - -注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0 - -### 赋值运算符 - -| 运算符 | 描述 | -| ----- | ---- | -| = += -= *= /= %= ^= **= | 赋值语句 | - -例: - -``` -a+=5; 等价于:a=a+5; 其它同类 -``` - -### 逻辑运算符 - -| 运算符 | 描述 | -| ----- | ---- | -| `\|\|` | 逻辑或 | -| && | 逻辑与 | - -例: - -``` -awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' -0 1 -``` - -### 正则运算符 - -| 运算符 | 描述 | -| ----- | ---- | -| ~ !~ | 匹配正则表达式和不匹配正则表达式 | - -例: - -``` -awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' -ok -``` - -### 关系运算符 - -| 运算符 | 描述 | -| ----- | ---- | -| < <= > >= != == | 关系运算符 | - -例: - -``` -awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' -ok -``` - -注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。 - -### 其它运算符 - -| 运算符 | 描述 | -| ----- | ---- | -| $ | 字段引用 | -| 空格 | 字符串连接符 | -| ?: | C条件表达式 | -| in | 数组中是否存在某键值 | - -例: - -``` -awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' -ok -``` - -``` -awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' -0 -``` - -``` -awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' -1 -``` - -### 运算级优先级表 - -!级别越高越优先 -级别越高越优先 - -## awk高级输入输出 - -### 读取下一条记录 - -awk中`next`语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并: - -``` -cat text.txt -a -b -c -d -e - -awk 'NR%2==1{next}{print NR,$0;}' text.txt -2 b -4 d -``` - -当记录行号除以2余1,就跳过当前行。下面的`print NR,$0`也不会执行。下一行开始,程序有开始判断`NR%2`值。这个时候记录行号是`:2` ,就会执行下面语句块:`'print NR,$0'` - -分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行: - -``` -cat text.txt -web01[192.168.2.100] -httpd ok -tomcat ok -sendmail ok -web02[192.168.2.101] -httpd ok -postfix ok -web03[192.168.2.102] -mysqld ok -httpd ok -0 -awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt -web01[192.168.2.100]: httpd ok -web01[192.168.2.100]: tomcat ok -web01[192.168.2.100]: sendmail ok -web02[192.168.2.101]: httpd ok -web02[192.168.2.101]: postfix ok -web03[192.168.2.102]: mysqld ok -web03[192.168.2.102]: httpd ok -``` - -### 简单地读取一条记录 - -`awk getline`用法:输出重定向需用到`getline函数`。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。 - -getline语法:getline var,变量var包含了特定行的内容。 - -awk getline从整体上来说,用法说明: - -* **当其左右无重定向符`|`或`<`时:** getline作用于当前文件,读入当前文件的第一行给其后跟的变量`var`或`$0`(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 -* **当其左右有重定向符`|`或`<`时:** getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。 - - **示例:** - -执行linux的`date`命令,并通过管道输出给`getline`,然后再把输出赋值给自定义变量out,并打印它: - -``` -awk 'BEGIN{ "date" | getline out; print out }' test -``` - -执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素: - -``` -awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test -``` - -命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。 - -``` -awk 'BEGIN{ while( "ls" | getline) print }' -``` - -### 关闭文件 - -awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 - -``` -close("filename") -``` - -filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。 - -### 输出到一个文件 - -awk中允许用如下方式将结果输出到一个文件: - -``` -echo | awk '{printf("hello word!n") > "datafile"}' -或 -echo | awk '{printf("hello word!n") >> "datafile"}' -``` - -## 设置字段定界符 - -默认的字段定界符是空格,可以使用`-F "定界符"` 明确指定一个定界符: - -``` -awk -F: '{ print $NF }' /etc/passwd -或 -awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd -``` - -在`BEGIN语句块`中则可以用`OFS=“定界符”`设置输出字段的定界符。 - -## 流程控制语句 - -在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。 - -### 条件判断语句 - -``` -if(表达式) - 语句1 -else - 语句2 -``` - -格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为: - -``` -if(表达式) - {语句1} -else if(表达式) - {语句2} -else - {语句3} -``` - -示例: - -``` -awk 'BEGIN{ -test=100; -if(test>90){ - print "very good"; - } - else if(test>60){ - print "good"; - } - else{ - print "no pass"; - } -}' - -very good -``` - -每条命令语句后面可以用`;` **分号** 结尾。 - -### 循环语句 - -#### while语句 - -``` -while(表达式) - {语句} -``` - -示例: - -``` -awk 'BEGIN{ -test=100; -total=0; -while(i<=test){ - total+=i; - i++; -} -print total; -}' -5050 -``` - -#### for循环 - -for循环有两种格式: - -格式1: - -``` -for(变量 in 数组) - {语句} -``` - -示例: - -``` -awk 'BEGIN{ -for(k in ENVIRON){ - print k"="ENVIRON[k]; -} - -}' -TERM=linux -G_BROKEN_FILENAMES=1 -SHLVL=1 -pwd=/root/text -... -logname=root -HOME=/root -SSH_CLIENT=192.168.1.21 53087 22 -``` - -注:ENVIRON是awk常量,是子典型数组。 - -格式2: - -``` -for(变量;条件;表达式) - {语句} -``` - -示例: - -``` -awk 'BEGIN{ -total=0; -for(i=0;i<=100;i++){ - total+=i; -} -print total; -}' -5050 -``` - -#### do循环 - -``` -do -{语句} while(条件) -``` - -例子: - -``` -awk 'BEGIN{ -total=0; -i=0; -do {total+=i;i++;} while(i<=100) - print total; -}' -5050 -``` - -### 其他语句 - -* **break** 当 break 语句用于 while 或 for 语句时,导致退出程序循环。 -* **continue** 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 -* **next** 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 -* **exit** 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 - -## 数组应用 - -数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。 - -### 数组的定义 - -数字做数组索引(下标): - -``` -Array[1]="sun" -Array[2]="kai" -``` - -字符串做数组索引(下标): - -``` -Array["first"]="www" -Array"[last"]="name" -Array["birth"]="1987" -``` - -使用中`print Array[1]`会打印出sun;使用`print Array[2]`会打印出kai;使用`print["birth"]`会得到1987。 - - **读取数组的值** - -``` -{ for(item in array) {print array[item]}; } #输出的顺序是随机的 -{ for(i=1;i<=len;i++) {print array[i]}; } #Len是数组的长度 -``` - -### 数组相关函数 - - **得到数组长度:** - -``` -awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' -4 4 -``` - -length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。 - -``` -awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' -4 -``` - -asort对数组进行排序,返回数组长度。 - - **输出数组内容(无序,有序输出):** - -``` -awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' -4 test -1 it -2 is -3 a -``` - -`for…in`输出,因为数组是关联数组,默认是无序的。所以通过`for…in`得到是无序的数组。如果需要得到有序数组,需要通过下标获得。 - -``` -awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' -1 it -2 is -3 a -4 test -``` - -注意:数组下标是从1开始,与C数组不一样。 - - **判断键值存在以及删除键值:** - -``` -#错误的判断方法: -awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' -no found -a a1 -b b1 -c -``` - -以上出现奇怪问题,`tB[“c”]`没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。 - -```bash -#正确判断方法: -awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' -a a1 -b b1 -``` - -`if(key in array)`通过这种方法判断数组中是否包含`key`键值。 - -```bash -#删除键值: -awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}' -b b1 -``` - -`delete array[key]`可以删除,对应数组`key`的,序列值。 - -### 二维、多维数组使用 - -awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(�34)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。 - -类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。 - -```bash -awk 'BEGIN{ -for(i=1;i<=9;i++){ - for(j=1;j<=9;j++){ - tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j]; - } -} -}' -1 * 1 = 1 -1 * 2 = 2 -1 * 3 = 3 -1 * 4 = 4 -1 * 5 = 5 -1 * 6 = 6 -... -9 * 6 = 54 -9 * 7 = 63 -9 * 8 = 72 -9 * 9 = 81 -``` - -可以通过`array[k,k2]`引用获得数组内容。 - -另一种方法: - -```bash -awk 'BEGIN{ -for(i=1;i<=9;i++){ - for(j=1;j<=9;j++){ - tarr[i,j]=i*j; - } -} -for(m in tarr){ - split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m]; -} -}' -``` - -## 内置函数 - -awk内置函数,主要分以下3种类似:算数函数、字符串函数、其它一般函数、时间函数。 - -### 算术函数 - -| 格式 | 描述 | -| ---- | ---- | -| atan2( y, x ) | 返回 y/x 的反正切。 | -| cos( x ) | 返回 x 的余弦;x 是弧度。 | -| sin( x ) | 返回 x 的正弦;x 是弧度。 | -| exp( x ) | 返回 x 幂函数。 | -| log( x ) | 返回 x 的自然对数。 | -| sqrt( x ) | 返回 x 平方根。 | -| int( x ) | 返回 x 的截断至整数的值。 | -| rand( ) | 返回任意数字 n,其中 0 <= n < 1。 | -| srand( [expr] ) | 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 | - - -举例说明: - -``` -awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' -0.841 22026.466 2.303 3 - -``` - -OFMT 设置输出数据格式是保留3位小数。 - -获得随机数: - -``` -awk 'BEGIN{srand();fr=int(100*rand());print fr;}' -78 -awk 'BEGIN{srand();fr=int(100*rand());print fr;}' -31 -awk 'BEGIN{srand();fr=int(100*rand());print fr;}' -41 -``` - -### 字符串函数 - -| 格式 | 描述 | -| ---- | ---- | -| gsub( Ere, Repl, [ In ] ) | 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 | -| sub( Ere, Repl, [ In ] ) | 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 | -| index( String1, String2 ) | 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。 | -| length [(String)] | 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 | -| blength [(String)] | 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 | -| substr( String, M, [ N ] ) | 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 | -| match( String, Ere ) | 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。| -| split( String, A, [Ere] ) | 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 | -| tolower( String ) | 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | -| toupper( String ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | -| sprintf(Format, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 | - - -注:Ere都可以是正则表达式。 - - **gsub,sub使用** - -``` -awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' -this is a test!test! -``` - -在 info中查找满足正则表达式,`/[0-9]+/` 用`””`替换,并且替换后的值,赋值给info 未给info值,默认是`$0` - - **查找字符串(index使用)** - -``` -awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' -ok -``` - -未找到,返回0 - - **正则表达式匹配查找(match使用)** - -``` -awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' -ok -``` - - **截取字符串(substr使用)** - -``` -[wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' -s is a tes -``` - -从第 4个 字符开始,截取10个长度字符串 - - **字符串分割(split使用)** - -``` -awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' -4 -4 test -1 this -2 is -3 a -``` - -分割info,动态创建数组tA,这里比较有意思,`awk for …in`循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。 - - **格式化字符串输出(sprintf使用)** - -格式化字符串格式: - -其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以`"%"`开始,后跟一个或几个规定字符,用来确定输出内容格式。 - -| 格式 | 描述 | 格式 | 描述 | -| ---- | ---- | ---- | ---- | -| %d | 十进制有符号整数 | %u | 十进制无符号整数 | -| %f | 浮点数 | %s | 字符串 | -| %c | 单个字符 | %p | 指针的值 | -| %e | 指数形式的浮点数 | %x | %X 无符号以十六进制表示的整数 | -| %o | 无符号以八进制表示的整数 | %g | 自动选择合适的表示法 | - - -``` -awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}' -124.11,18446744073709551615,1.2,7C,174 -``` - -### 一般函数 - -| 格式 | 描述 | -| ---- | ---- | -| close( Expression ) | 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。 | -| system(command ) | 执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。| -| Expression `\|` getline [ Variable ] | 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。| -| getline [ Variable ] < Expression | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 | -| getline [ Variable ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 | - - **打开外部文件(close用法)** - -``` -awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' -root:x:0:0:root:/root:/bin/bash -bin:x:1:1:bin:/bin:/sbin/nologin -daemon:x:2:2:daemon:/sbin:/sbin/nologin -``` - - **逐行读取外部文件(getline使用方法)** - -``` -awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' -root:x:0:0:root:/root:/bin/bash -bin:x:1:1:bin:/bin:/sbin/nologin -daemon:x:2:2:daemon:/sbin:/sbin/nologin -``` - -``` -awk 'BEGIN{print "Enter your name:";getline name;print name;}' -Enter your name: -chengmo -chengmo -``` - - **调用外部应用程序(system使用方法)** - -``` -awk 'BEGIN{b=system("ls -al");print b;}' -total 42092 -drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 . -drwxr-xr-x 95 root root 4096 10-08 14:01 .. -``` - -b返回值,是执行结果。 - -### 时间函数 - -| 格式 | 描述 | -| ---- | ---- | -| 函数名 | 说明 | -| mktime( YYYY MM dd HH MM ss[ DST]) | 生成时间格式 | -| strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串具体格式,见下表。 | -| systime() | 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 | - - **建指定时间(mktime使用)** - -``` -awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' -2001年01月01日 星期一 12时12分12秒 -``` - -``` -awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' -2634468 -``` - -求2个时间段中间时间差,介绍了strftime使用方法 - -``` -awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' -308201392 -``` - - **strftime日期和时间格式说明符** - -| 格式 | 描述 | -| ---- | ---- | -| %a | 星期几的缩写(Sun) | -| %A | 星期几的完整写法(Sunday) | -| %b | 月名的缩写(Oct) | -| %B | 月名的完整写法(October) | -| %c | 本地日期和时间 | -| %d | 十进制日期 | -| %D | 日期 08/20/99 | -| %e | 日期,如果只有一位会补上一个空格 | -| %H | 用十进制表示24小时格式的小时 | -| %I | 用十进制表示12小时格式的小时 | -| %j | 从1月1日起一年中的第几天 | -| %m | 十进制表示的月份 | -| %M | 十进制表示的分钟 | -| %p | 12小时表示法(AM/PM) | -| %S | 十进制表示的秒 | -| %U | 十进制表示的一年中的第几个星期(星期天作为一个星期的开始) | -| %w | 十进制表示的星期几(星期天是0) | -| %W | 十进制表示的一年中的第几个星期(星期一作为一个星期的开始) | -| %x | 重新设置本地日期(08/20/99) | -| %X | 重新设置本地时间(12:00:00) | -| %y | 两位数字表示的年(99) | -| %Y | 当前月份 | -| %% | 百分号(%) | - - +# awk + +=== + +文本和数据进行处理的编程语言 + +## 补充说明 + +**awk** 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。 + +## awk命令格式和选项 + +### 语法形式 + +```sh +awk [options] 'script' var=value file(s) +awk [options] -f scriptfile var=value file(s) +``` + +### 常用命令选项 + +***-F fs   *** fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: +***-v var=value   *** 赋值一个用户定义变量,将外部变量传递给awk +***-f scripfile  *** 从脚本文件中读取awk命令 +***-m[fr] val   *** 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 + +## awk模式和操作 + +awk脚本是由模式和操作组成的。 + +### 模式 + +模式可以是以下任意一个: + +* /正则表达式/:使用通配符的扩展集。 +* 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 +* 模式匹配表达式:用运算符`~`(匹配)和`~!`(不匹配)。 +* BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理 + +### 操作 + +操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是: + +* 变量或数组赋值 +* 输出命令 +* 内置函数 +* 控制流语句 + +## awk脚本基本结构 + +```sh +awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file +``` + +一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被** 单引号** 或** 双引号** 中,例如: + +```sh +awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename +awk "BEGIN{ i=0 } { i++ } END{ print i }" filename +``` + +### awk的工作原理 + +```sh +awk 'BEGIN{ commands } pattern{ commands } END{ commands }' +``` + +* 第一步:执行`BEGIN{ commands }`语句块中的语句; +* 第二步:从文件或标准输入(stdin)读取一行,然后执行`pattern{ commands }`语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 +* 第三步:当读至输入流末尾时,执行`END{ commands }`语句块。 + +**BEGIN语句块** 在awk开始从输入流中读取行** 之前** 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 + +**END语句块** 在awk从输入流中读取完所有的行** 之后** 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 + +**pattern语句块** 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行`{ print }`,即打印每一个读取到的行,awk读取的每一行都会执行该语句块。 + +### 示例 + +```sh +echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' +Start +A line 1 +A line 2 +End +``` + +当使用不带参数的`print`时,它就打印当前行,当`print`的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如: + +```sh +echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' +v1 v2 v3 +``` + +双引号拼接使用: + +```sh +echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' +v1=v2=v3 +``` + +{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。 + +## awk内置变量(预定义变量) + +说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk + +```sh +** $n**当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 +** $0**这个变量包含执行过程中当前行的文本内容。 +[N]**ARGC**命令行参数的数目。 +[G]**ARGIND**命令行中当前文件的位置(从0开始算)。 +[N]**ARGV**包含命令行参数的数组。 +[G]**CONVFMT**数字转换格式(默认值为%.6g)。 +[P]**ENVIRON**环境变量关联数组。 +[N]**ERRNO**最后一个系统错误的描述。 +[G]**FIELDWIDTHS**字段宽度列表(用空格键分隔)。 +[A]**FILENAME**当前输入文件的名。 +[P]**FNR**同NR,但相对于当前文件。 +[A]**FS**字段分隔符(默认是任何空格)。 +[G]**IGNORECASE**如果为真,则进行忽略大小写的匹配。 +[A]**NF**表示字段数,在执行过程中对应于当前的字段数。 +[A]**NR**表示记录数,在执行过程中对应于当前的行号。 +[A]**OFMT**数字的输出格式(默认值是%.6g)。 +[A]**OFS**输出字段分隔符(默认值是一个空格)。 +[A]**ORS**输出记录分隔符(默认值是一个换行符)。 +[A]**RS**记录分隔符(默认是一个换行符)。 +[N]**RSTART**由match函数所匹配的字符串的第一个位置。 +[N]**RLENGTH**由match函数所匹配的字符串的长度。 +[N]**SUBSEP**数组下标分隔符(默认值是34)。 +``` + +示例 + +FS示例 + +```sh +awk FS变量用于设置每个记录的字段分割符,其可以设置为任何单个字符或者正则表达式 +FS可以更改任意次数,会保留其值直到明确更改,如果想更改字段分割符,在阅读行之前更改,固此改变会影响阅读的内容 + +awk -F 'FS''命令'文件名 +或 +awk 'BEGIN {FS="FS";}' + +用于读取具有:作为字段分割符的/etc/passwd文件:awk -f etc_pass.awk /etc/passwd +BEGIN{ +FS = ":"; +print "\tUserID\tGroupID\tHomeDirectory"; +} +{ + print $1"\t"$3"\t"$4"\t"$6; +} +END{ + print NR,"打印记录" +#NR统计打印的数目 +} + +awk OFS是awk FS变量的输出,默认情况,awk OFS是单个空格字符 + +awk -F ':' '{print $3,$4;}' /etc/passwd + +打印语句中的:,默认情况下两个参数连接为一个空间,该空间是awk OFS的值,固其值被插入到输出中的字段之间 + +awk -F ':' 'BEGIN{OFS ="=";}{print $3,$4;}' /etc/passwd +``` + +awk RS示例:记录分割符变量 + +```sh +awk RS定义了一条线,awk默认逐行读取。将信息存储在一个文件中,每个记录由两个新行隔开,每个字段用一个新行分割 + +打印姓名和第二行数字 + +cat student.awk +BEGIN { + RS =“\ n \ n”;; + FS = “\ n”个; + +} +{ + print $ 1,$ 2; +} + +awk -f student.awk student.txt + + + +``` + +```sh +echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' +Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 +Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 +Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7 +``` + +使用`print $NF`可以打印出一行中的最后一个字段,使用`$(NF-1)`则是打印倒数第二个字段,其他以此类推: + +```sh +echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}' +f3 +f5 +``` + +```sh +echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}' +f2 +f4 + +``` + +打印每一行的第二和第三个字段: + +```sh +awk '{ print $2,$3 }' filename +``` + +统计文件中的行数: + +```sh +awk 'END{ print NR }' filename +``` + +以上命令只使用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数。 + +一个每一行中第一个字段值累加的例子: + +```sh +seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' +总和: +1+ +2+ +3+ +4+ +5+ +等于 +15 +``` + +## 将外部变量值传递给awk + +借助** `-v`选项** ,可以将外部值(并非来自stdin)传递给awk: + +```sh +VAR=10000 +echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' +``` + +另一种传递外部变量方法: + +```sh +var1="aaa" +var2="bbb" +echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 +``` + +当输入来自于文件时使用: + +```sh +awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename +``` + +以上方法中,变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。 + +## 查找进程pid + +```sh +netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' +``` + +## awk运算与判断 + +作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和~!(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。 + +### 算术运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| + - | 加,减 | +| * / & | 乘,除与求余 | +| + - ! | 一元加,减和逻辑非 | +| ^** * | 求幂 | +| ++ -- | 增加或减少,作为前缀或后缀 | + +例: + +```sh +awk 'BEGIN{a="b";print a++,++a;}' +0 2 +``` + +注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0 + +### 赋值运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| = += -= *= /= %= ^=** = | 赋值语句 | + +例: + +```sh +a+=5; 等价于:a=a+5; 其它同类 +``` + +### 逻辑运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| `\|\|` | 逻辑或 | +| && | 逻辑与 | + +例: + +```sh +awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' +0 1 +``` + +### 正则运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| ~ ~! | 匹配正则表达式和不匹配正则表达式 | + +例: + +```sh +awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' +ok +``` + +### 关系运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| < <= > >= != == | 关系运算符 | + +例: + +```sh +awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' +ok +``` + +注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。 + +### 其它运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| $ | 字段引用 | +| 空格 | 字符串连接符 | +| ?: | C条件表达式 | +| in | 数组中是否存在某键值 | + +例: + +```sh +awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' +ok +``` + +```sh +awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' +0 +``` + +```sh +awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' +1 +``` + +### 运算级优先级表 + +!级别越高越优先 +级别越高越优先 + +## awk高级输入输出 + +### 读取下一条记录 + +awk中`next`语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并: + +```sh +cat text.txt +a +b +c +d +e + +awk 'NR%2==1{next}{print NR,$0;}' text.txt +2 b +4 d +``` + +当记录行号除以2余1,就跳过当前行。下面的`print NR,$0`也不会执行。下一行开始,程序有开始判断`NR%2`值。这个时候记录行号是`:2` ,就会执行下面语句块:`'print NR,$0'` + +分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行: + +```sh +cat text.txt +web01[192.168.2.100] +httpdok +tomcat ok +sendmail ok +web02[192.168.2.101] +httpdok +postfix ok +web03[192.168.2.102] +mysqldok +httpd ok +0 +awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt +web01[192.168.2.100]: httpdok +web01[192.168.2.100]: tomcat ok +web01[192.168.2.100]: sendmail ok +web02[192.168.2.101]: httpdok +web02[192.168.2.101]: postfix ok +web03[192.168.2.102]: mysqldok +web03[192.168.2.102]: httpd ok +``` + +### 简单地读取一条记录 + +`awk getline`用法:输出重定向需用到`getline函数`。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。 + +getline语法:getline var,变量var包含了特定行的内容。 + +awk getline从整体上来说,用法说明: + +***当其左右无重定向符`|`或`<`时:** getline作用于当前文件,读入当前文件的第一行给其后跟的变量`var`或`$0`(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 +***当其左右有重定向符`|`或`<`时:** getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。 + +** 示例:** + +执行linux的`date`命令,并通过管道输出给`getline`,然后再把输出赋值给自定义变量out,并打印它: + +```sh +awk 'BEGIN{ "date" | getline out; print out }' test +``` + +执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素: + +```sh +awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test +``` + +命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。 + +```sh +awk 'BEGIN{ while( "ls" | getline) print }' +``` + +### 关闭文件 + +awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 + +```sh +close("filename") +``` + +filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。 + +### 输出到一个文件 + +awk中允许用如下方式将结果输出到一个文件: + +```sh +echo | awk '{printf("hello word!n") > "datafile"}' +或 +echo | awk '{printf("hello word!n") >> "datafile"}' +``` + +## 设置字段定界符 + +默认的字段定界符是空格,可以使用`-F "定界符"`明确指定一个定界符: + +```sh +awk -F: '{ print $NF }' /etc/passwd +或 +awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd +``` + +在`BEGIN语句块`中则可以用`OFS=“定界符”`设置输出字段的定界符。 + +## 流程控制语句 + +在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。 + +### 条件判断语句 + +```sh +if(表达式) +语句1 +else +语句2 +``` + +格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为: + +```sh +if(表达式) +{语句1} +else if(表达式) +{语句2} +else +{语句3} +``` + +示例: + +```sh +awk 'BEGIN{ +test=100; +if(test>90){ +print "very good"; +} +else if(test>60){ +print "good"; +} +else{ +print "no pass"; +} +}' + +very good +``` + +每条命令语句后面可以用`;`** 分号** 结尾。 + +### 循环语句 + +#### while语句 + +```sh +while(表达式) +{语句} +``` + +示例: + +```sh +awk 'BEGIN{ +test=100; +total=0; +while(i<=test){ +total+=i; +i++; +} +print total; +}' +5050 +``` + +#### for循环 + +for循环有两种格式: + +格式1: + +```sh +for(变量 in 数组) +{语句} +``` + +示例: + +```sh +awk 'BEGIN{ +for(k in ENVIRON){ +print k"="ENVIRON[k]; +} + +}' +TERM=linux +G_BROKEN_FILENAMES=1 +SHLVL=1 +pwd=/root/text +... +logname=root +HOME=/root +SSH_CLIENT=192.168.1.21 53087 22 +``` + +注:ENVIRON是awk常量,是子典型数组。 + +格式2: + +```sh +for(变量;条件;表达式) +{语句} +``` + +示例: + +```sh +awk 'BEGIN{ +total=0; +for(i=0;i<=100;i++){ +total+=i; +} +print total; +}' +5050 +``` + +#### do循环 + +```sh +do +{语句} while(条件) +``` + +例子: + +```sh +awk 'BEGIN{ +total=0; +i=0; +do {total+=i;i++;} while(i<=100) +print total; +}' +5050 +``` + +### 其他语句 + +***break**当 break 语句用于 while 或 for 语句时,导致退出程序循环。 +***continue**当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 +***next**能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 +***exit**语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 + +## 数组应用 + +数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。 + +### 数组的定义 + +数字做数组索引(下标): + +```sh +Array[1]="sun" +Array[2]="kai" +``` + +字符串做数组索引(下标): + +```sh +Array["first"]="www" +Array"[last"]="name" +Array["birth"]="1987" +``` + +使用中`print Array[1]`会打印出sun;使用`print Array[2]`会打印出kai;使用`print["birth"]`会得到1987。 + +** 读取数组的值** + +```sh +{ for(item in array) {print array[item]}; } #输出的顺序是随机的 +{ for(i=1;i<=len;i++) {print array[i]}; } #Len是数组的长度 +``` + +### 数组相关函数 + +** 得到数组长度:** + +```sh +awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' +4 4 +``` + +length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。 + +```sh +awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' +4 +``` + +asort对数组进行排序,返回数组长度。 + +** 输出数组内容(无序,有序输出):** + +```sh +awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' +4 test +1 it +2 is +3 a +``` + +`for…in`输出,因为数组是关联数组,默认是无序的。所以通过`for…in`得到是无序的数组。如果需要得到有序数组,需要通过下标获得。 + +```sh +awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' +1 it +2 is +3 a +4 test +``` + +注意:数组下标是从1开始,与C数组不一样。 + +** 判断键值存在以及删除键值:** + +```sh +#错误的判断方法: +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' +no found +a a1 +b b1 +c +``` + +以上出现奇怪问题,`tB[“c”]`没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。 + +```bash +#正确判断方法: +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' +a a1 +b b1 +``` + +`if(key in array)`通过这种方法判断数组中是否包含`key`键值。 + +```bash +#删除键值: +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}' +b b1 +``` + +`delete array[key]`可以删除,对应数组`key`的,序列值。 + +### 二维、多维数组使用 + +awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(�34)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。 + +类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。 + +```bash +awk 'BEGIN{ +for(i=1;i<=9;i++){ +for(j=1;j<=9;j++){ +tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j]; +} +} +}' +1 * 1 = 1 +1 * 2 = 2 +1 * 3 = 3 +1 * 4 = 4 +1 * 5 = 5 +1 * 6 = 6 +... +9 * 6 = 54 +9 * 7 = 63 +9 * 8 = 72 +9 * 9 = 81 +``` + +可以通过`array[k,k2]`引用获得数组内容。 + +另一种方法: + +```bash +awk 'BEGIN{ +for(i=1;i<=9;i++){ +for(j=1;j<=9;j++){ +tarr[i,j]=i*j; +} +} +for(m in tarr){ +split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m]; +} +}' +``` + +## 内置函数 + +awk内置函数,主要分以下3种类似:算数函数、字符串函数、其它一般函数、时间函数。 + +### 算术函数 + +| 格式 | 描述 | +| ---- | ---- | +| atan2( y, x ) | 返回 y/x 的反正切。 | +| cos( x ) | 返回 x 的余弦;x 是弧度。 | +| sin( x ) | 返回 x 的正弦;x 是弧度。 | +| exp( x ) | 返回 x 幂函数。 | +| log( x ) | 返回 x 的自然对数。 | +| sqrt( x ) | 返回 x 平方根。 | +| int( x ) | 返回 x 的截断至整数的值。 | +| rand( ) | 返回任意数字 n,其中 0 <= n < 1。 | +| srand( [expr] ) | 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 | + +举例说明: + +```sh +awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' +0.841 22026.466 2.303 3 + +``` + +OFMT 设置输出数据格式是保留3位小数。 + +获得随机数: + +```sh +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' +78 +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' +31 +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' +41 +``` + +### 字符串函数 + +| 格式 | 描述 | +| ---- | ---- | +| gsub( Ere, Repl, [ In ] ) | 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 | +| sub( Ere, Repl, [ In ] ) | 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 | +| index( String1, String2 ) | 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。 | +| length [(String)] | 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 | +| blength [(String)] | 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 | +| substr( String, M, [ N ] ) | 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 | +| match( String, Ere ) | 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。| +| split( String, A, [Ere] ) | 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 | +| tolower( String ) | 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | +| toupper( String ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | +| sprintf(Format, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 | + +注:Ere都可以是正则表达式。 + +** gsub,sub使用** + +```sh +awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' +this is a test!test! +``` + +在 info中查找满足正则表达式,`/[0-9]+/` 用`””`替换,并且替换后的值,赋值给info 未给info值,默认是`$0` + +** 查找字符串(index使用)** + +```sh +awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' +ok +``` + +未找到,返回0 + +** 正则表达式匹配查找(match使用)** + +```sh +awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' +ok +``` + +** 截取字符串(substr使用)** + +```sh +[wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' +s is a tes +``` + +从第 4个 字符开始,截取10个长度字符串 + +** 字符串分割(split使用)** + +```sh +awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' +4 +4 test +1 this +2 is +3 a +``` + +分割info,动态创建数组tA,这里比较有意思,`awk for …in`循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。 + +** 格式化字符串输出(sprintf使用)** + +格式化字符串格式: + +其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以`"%"`开始,后跟一个或几个规定字符,用来确定输出内容格式。 + +| 格式 | 描述 | 格式 | 描述 | +| ---- | ---- | ---- | ---- | +| %d | 十进制有符号整数 | %u | 十进制无符号整数 | +| %f | 浮点数 | %s | 字符串 | +| %c | 单个字符 | %p | 指针的值 | +| %e | 指数形式的浮点数 | %x | %X 无符号以十六进制表示的整数 | +| %o | 无符号以八进制表示的整数 | %g | 自动选择合适的表示法 | + +```sh +awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}' +124.11,18446744073709551615,1.2,7C,174 +``` + +### 一般函数 + +| 格式 | 描述| +| ---- | ---- | +| close( Expression ) | 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。 | +| system(command ) | 执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。| +| Expression `\|` getline [ Variable ] | 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。| +| getline [ Variable ] < Expression | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 | +| getline [ Variable ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 | + +** 打开外部文件(close用法)** + +```sh +awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +``` + +** 逐行读取外部文件(getline使用方法)** + +```sh +awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +``` + +```sh +awk 'BEGIN{print "Enter your name:";getline name;print name;}' +Enter your name: +chengmo +chengmo +``` + +** 调用外部应用程序(system使用方法)** + +```sh +awk 'BEGIN{b=system("ls -al");print b;}' +total 42092 +drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 . +drwxr-xr-x 95 root root 4096 10-08 14:01 .. +``` + +b返回值,是执行结果。 + +### 时间函数 + +| 格式 | 描述| +| ---- | ---- | +| 函数名 | 说明 | +| mktime( YYYY MM dd HH MM ss[ DST]) | 生成时间格式 | +| strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串具体格式,见下表。 | +| systime() | 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 | + +** 建指定时间(mktime使用)** + +```sh +awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' +2001年01月01日 星期一 12时12分12秒 +``` + +```sh +awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' +2634468 +``` + +求2个时间段中间时间差,介绍了strftime使用方法 + +```sh +awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' +308201392 +``` + +** strftime日期和时间格式说明符** + +| 格式 | 描述| +| ---- | ---- | +| %a | 星期几的缩写(Sun) | +| %A | 星期几的完整写法(Sunday) | +| %b | 月名的缩写(Oct) | +| %B | 月名的完整写法(October) | +| %c | 本地日期和时间 | +| %d | 十进制日期 | +| %D | 日期 08/20/99 | +| %e | 日期,如果只有一位会补上一个空格 | +| %H | 用十进制表示24小时格式的小时 | +| %I | 用十进制表示12小时格式的小时 | +| %j | 从1月1日起一年中的第几天 | +| %m | 十进制表示的月份 | +| %M | 十进制表示的分钟 | +| %p | 12小时表示法(AM/PM) | +| %S | 十进制表示的秒 | +| %U | 十进制表示的一年中的第几个星期(星期天作为一个星期的开始) | +| %w | 十进制表示的星期几(星期天是0) | +| %W | 十进制表示的一年中的第几个星期(星期一作为一个星期的开始) | +| %x | 重新设置本地日期(08/20/99) | +| %X | 重新设置本地时间(12:00:00) | +| %y | 两位数字表示的年(99) | +| %Y | 当前月份 | +| %% | 百分号(%) | + +### 文件间隔 + +```sh +#双空间文件 +awk'1; {print“”}' +awk'BEGIN {ORS =“\ n \ n”}; 1' + +#双空间的文件已经有空行。输出文件 +#在文本行之间应该包含不超过一个空白行。 +#注意:在Unix系统上,只有CRLF(\ r \ n)的DOS行是 +#经常被视为非空白,因此仅'NF'将返回TRUE。 +awk'NF {print $ 0“\ n”}' + +#三重空间文件 +awk'1; {print“\ n”}' +``` + +### 编号和计算: + +#在每行的前面加上行号为该文件(左对齐)。 +#使用选项卡(\ t)而不是空格将保留页边距。 +awk'{print FNR'\ t“$ 0}'文件* + +#在每行的前面加上行号FOR ALL FILES TOGETHER,并带有制表符。 +awk'{print NR'\ t“$ 0}'文件* + +#编号文件的每一行(左边的数字,右对齐) +#如果从DOS命令提示符处键入,则将符号加倍。 +awk'{printf(“%5d:%s \ n”,NR,$ 0)}' + +#为文件的每一行编号,但如果行不是空白,则只打印数字 +#记住关于\ r的Unix处理的注意事项(如上所述) +awk'NF {$ 0 = ++ a“:”$ 0}; 1' +awk'{print(NF?++ a“:”:“”)$ 0}' + +#计数行(模拟“wc -l”) +awk'END {print NR}' + +#打印每行的字段总和 +awk'{s = 0; 对于(i = 1; i <= NF; i ++)s = s + $ i; 打印s}' + +#添加所有行中的所有字段并打印总和 +awk'{for(i = 1; i <= NF; i ++)s = s + $ i}; END {print s}' + +#在用绝对值替换每个字段后,每行打印一行 +awk'{for(i = 1; i <= NF; i ++)if($ i <0)$ i =-$ i; 打印}' +awk'{for(i = 1; i <= NF; i ++)$ i =($ i <0)? -$ i:$ i; 打印}' + +#在所有行中打印字段总数(“字数”) +awk'{total = total + NF}; END {打印总计}'文件 + +#打印包含“Beth”的总行数 +awk'/ Beth / {n ++}; END {print n + 0}'文件 + +#打印最大的第一个字段和包含它的行 +#旨在查找字段#1中最长的字符串 +awk'$ 1> max {max = $ 1; MAXLINE = $ 0}; END {print max,maxline}' + +#打印每行中的字段数,然后是行 +awk'{print NF':“$ 0}' + +#打印每行的最后一个字段 +awk'{print $ NF}' + +#打印最后一行的最后一个字段 +awk'{field = $ NF}; END {打印字段}' + +#打印每行超过4个字段 +awk'NF> 4' + +#打印最后一个字段值大于4的每一行 +awk'$ NF> 4' + +创建字符串: + +#创建一个特定长度的字符串(例如,生成513个空格) +awk'BEGIN {while(a ++ <513)s = s“”; 打印s}' + +#在特定字符位置插入特定长度的字符串 +#示例:在每个输入行的#6列之后插入49个空格。 +gawk --re-interval'BEGIN {while(a ++ <49)s = s“”}; {sub(/ ^。{6} /,“&”s)}; 1' + +```sh + +### 阵列创作 + +```sh + +#接下来的2个条目不是单行脚本,而是技术 +#非常方便,因此在这里值得一试。 + +#创建一个名为“月”的数组,索引数字,以便该月[1] +#是'Jan',月份[2]是'Feb',月份[3]是'Mar'等等。 +拆分(“1月2月3月4月5月6月7月8月9月10月11月12月”,月,“”) + +#创建一个名为“mdigit”的数组,用字符串索引,这样 +#mdigit [“Jan”]是1,mdigit [“Feb”]是2等等。需要“月”数组 +for(i = 1; i <= 12; i ++)mdigit [month [i]] = i + +``` + +### 文本转换和替换: + +```sh + +#在UNIX环境中:将DOS换行符(CR / LF)转换为Unix格式 +awk'{sub(/ \ r $ /,“”)}; 1'#假设每行都以Ctrl-M结尾 + +#在UNIX环境中:将Unix换行符(LF)转换为DOS格式 +awk'{sub(/ $ /,“\ r”)}; 1' + +#在DOS环境下:将Unix换行符(LF)转换为DOS格式 +awk 1 + +#在DOS环境下:将DOS换行符(CR / LF)转换为Unix格式 +#不能用DOS版本的awk完成,除了gawk: +gawk -v BINMODE =“w”'1'infile> outfile + +#使用“tr”代替。 +tr -d \ r outfile#GNU tr版本1.22或更高 + +#从每行前面删除前导空格(空格,制表符) +#左对齐所有文本 +awk'{sub(/ ^ [\ t] + /,“”)}; 1' + +#从每行末尾删除尾随空格(空格,制表符) +awk'{sub(/ [\ t] + $ /,“”)}; 1' + +#删除每行的前导和尾随空白 +awk'{gsub(/ ^ [\ t] + | [\ t] + $ /,“”)}; 1' +awk'{$ 1 = $ 1}; 1'#也会删除字段之间的额外空间 + +#在每行的开头插入5个空格(使页面偏移) +awk'{sub(/ ^ /,“”)}; 1' + +#将所有文本均匀对齐到79列宽度 +awk'{printf'%79s \ n“,$ 0}'文件* + +#将所有文字放在79个字符的宽度上 +awk'{l = length(); s = int((79-1)/ 2); printf“%”(s + l)“s \ n”,$ 0}'文件* + +#在每行上用“bar”代替(查找并替换)“foo” +awk'{sub(/ foo /,“bar”)}; 1'#只替换第一个实例 +gawk'{$ 0 = gensub(/ foo /,“bar”,4)}; 1'#只替换第四个实例 +awk'{gsub(/ foo /,“bar”)}; 1'#将所有实例替换成一行 + +#将“foo”替换为“bar”,仅用于包含“baz” +awk'/ baz / {gsub(/ foo /,“bar”)}; 1' + +#将“foo”替换为“bar”除了包含“baz”的行以外 +awk'!/ baz / {gsub(/ foo /,“bar”)}; 1' + +#将“猩红”或“红宝石”或“puce”改为“红色” +awk'{gsub(/ scarlet | ruby​​ | puce /,“red”)}; 1' + +#行的反向顺序(模拟“tac”) +awk'{a [i ++] = $ 0} END {for(j = i-1; j> = 0;)print a [j--]}'file * + +#如果一行以反斜杠结尾,则将下一行追加到它(如果失败,则失败 +#有多行以反斜杠结尾......) +awk'/ \\ $ / {sub(/ \\ $ /,“”); getline t; 打印$ 0 t; 下一个}; 1'文件* + +#打印并排序所有用户的登录名 +awk -F“:”'{print $ 1 | “sort”}'/ etc / passwd + +#按每行的相反顺序打印前两个字段 +awk'{print $ 2,$ 1}'文件 + +#切换每行的前两个字段 +awk'{temp = $ 1; $ 1 = $ 2; $ 2 = temp}'文件 + +#打印每一行,删除该行的第二个字段 +awk'{$ 2 =“”; 打印}' + +#按相反顺序打印每行的字段 +awk'{for(i = NF; i> 0; i--)printf(“%s”,$ i); print“”}'file + +#使用逗号分隔符连接每5行输入 +#字段之间 +awk'ORS = NR%5?“,”:“\ n”'文件 + +``` + +### 选择性印刷某些线条 + +```sh + +#打印前10行文件(模拟“head”的行为) +awk'NR <11' + +#打印文件的第一行(模拟“head -1”) +awk'NR> 1 {exit}; 1' + + #打印文件的最后两行(模拟“tail -2”) +awk'{y = x“\ n”$ 0; x = $ 0}; END {print y}' + +#打印文件的最后一行(模拟“tail -1”) +awk'END {print}' + +#只打印符合正则表达式的行(模拟“grep”) +awk'/ regex /' + +#只打印与正则表达式不匹配的行(模拟“grep -v”) +awk'!/ regex /' + +#打印字段#5等于“abc123”的任何行 +awk'$ 5 ==“abc123”' + +#仅打印字段#5不等于“abc123”的行 +#这也将打印少于5个字段的行。 +awk'$ 5!=“abc123”' +awk'!($ 5 ==“abc123”)' + +#将字段与正则表达式匹配 +awk'$ 7〜/ ^ [af] /'#print line if field#7 matches regex +awk'$ 7!〜/ ^ [af] /'#print line if field#7 does not match regex + +#在正则表达式之前立即打印行,但不是行 +#包含正则表达式 +awk'/ regex / {print x}; {x = $ 0}' +awk'/ regex / {print(NR == 1?“match line 1:x)}; {x = $ 0}' + +#在正则表达式之后立即打印行,但不是行 +#包含正则表达式 +awk'/ regex / {getline; print}' + +#grep for AAA和BBB和CCC(在同一行上以任意顺序) +awk'/ AAA / && / BBB / && / CCC /' + +#grep用于AAA和BBB和CCC(按此顺序) +awk'/AAA.*BBB.*CCC/' + +#只能打印65个字符或更长的行 +awk'长度> 64' + +#仅打印少于65个字符的行 +awk'长度<64' + +#从正则表达式到文件结束的文件的打印部分 +awk'/ regex /,0' +awk'/ regex /,EOF' + +#根据行号打印文件部分(第8-12行,含) +awk'NR == 8,NR == 12' + +#打印行号52 +awk'NR == 52' +awk'NR == 52 {print; exit}'#在大文件上效率更高 + +#打印两个正则表达式之间的文件部分(含) +awk'/爱荷华州/,/蒙大拿州/'#区分大小写 + +``` + +### 选择性删除某些行 + +```sh + +# 删除文件中的所有空白行(与“grep”。'相同) +awk NF +awk'/./' + +# 删除重复的连续行(模拟“uniq”) +awk'a!〜$ 0; {A = $ 0}” + +# 删除重复的,不连续的行 +awk'!a [$ 0] ++'#最简洁的脚本 +awk'!($ a中){a [$ 0]; print}'#最高效的脚本 + +# 删除重复的行 +awk '!($0 in array) { array[$0]; print }' temp + +``` + +### 统计apache日志单ip访问请求数排名(常用,解答方法10多种) + +```sh + +方法一: +awk '{++S[$1]} END {for (variable in S) print variable ,S[variable]}' access.log |sort -rn -k2 +$1为第一个域的内容。-k2 为对第二个字段排序,即对数量排序。 + +方法二: +awk '{print $1}' access.log|sort|uniq -c |sort -rn -k1 + +方法三: +sed's/- -.*$//g' access.log|sort|uniq -c|sort -rn -k1 + +``` + +### 打印行号和内容: + +```sh + +awk '{print NR":"$0}' + +输出:偶数行和奇数行到文件 + +awk '{print $0.txt > NR%2.txt}' file + +打印出奇数行内容:(三者等价) + +awk 'NR%2==1' file + +awk 'NR%2' all_file.txt + +awk 'i=!i' file + +打印出偶数行的内容:(三者等价) + +awk 'NR%2==0' file + +awk '!(NR%2)' file + +awk '!(i=!i)' file + +``` + + diff --git a/LearnShell/LinuxCommands/basename.md b/LearnShell/LinuxCommands/basename.md old mode 100644 new mode 100755 index 610c746..0205575 --- a/LearnShell/LinuxCommands/basename.md +++ b/LearnShell/LinuxCommands/basename.md @@ -1,6 +1,6 @@ basename === - + 打印目录或者文件的基本名称 ## 补充说明 diff --git a/LearnShell/LinuxCommands/bc.md b/LearnShell/LinuxCommands/bc.md old mode 100644 new mode 100755 index bf955c6..7763863 --- a/LearnShell/LinuxCommands/bc.md +++ b/LearnShell/LinuxCommands/bc.md @@ -16,9 +16,10 @@ bc(选项)(参数) ### 选项 ``` --i:强制进入交互式模式; +-i:强制进入交互式模式;输入quit后回车退出此模式; -l:定义使用的标准数学库; -w:对POSIX bc的扩展给出警告信息; +-s --standard non-standard bc constructs are errors -q:不打印正常的GNU bc环境信息; -v:显示指令版本信息; -h:显示指令的帮助信息。 diff --git a/LearnShell/LinuxCommands/bind.md b/LearnShell/LinuxCommands/bind.md old mode 100644 new mode 100755 index 2949d85..fa48bec --- a/LearnShell/LinuxCommands/bind.md +++ b/LearnShell/LinuxCommands/bind.md @@ -1,6 +1,6 @@ bind === - + 显示或设置键盘按键与其相关的功能 ## 补充说明 diff --git a/LearnShell/LinuxCommands/blkid.md b/LearnShell/LinuxCommands/blkid.md old mode 100644 new mode 100755 index 91055ff..9d93c77 --- a/LearnShell/LinuxCommands/blkid.md +++ b/LearnShell/LinuxCommands/blkid.md @@ -1,6 +1,6 @@ blkid === - + 查看块设备的文件系统类型、LABEL、UUID等信息 ## 补充说明 diff --git a/LearnShell/LinuxCommands/cal.md b/LearnShell/LinuxCommands/cal.md old mode 100644 new mode 100755 index 3a17503..2346a67 --- a/LearnShell/LinuxCommands/cal.md +++ b/LearnShell/LinuxCommands/cal.md @@ -1,6 +1,6 @@ cal === - + 显示当前日历或指定日期的日历 ## 补充说明 diff --git a/LearnShell/LinuxCommands/cat.md b/LearnShell/LinuxCommands/cat.md old mode 100644 new mode 100755 index 572ca57..e14a113 --- a/LearnShell/LinuxCommands/cat.md +++ b/LearnShell/LinuxCommands/cat.md @@ -1,6 +1,6 @@ cat === - + 连接文件并打印到标准输出设备上 ## 补充说明 diff --git a/LearnShell/LinuxCommands/cd.md b/LearnShell/LinuxCommands/cd.md old mode 100644 new mode 100755 index 78c5adf..c676dd5 --- a/LearnShell/LinuxCommands/cd.md +++ b/LearnShell/LinuxCommands/cd.md @@ -1,6 +1,6 @@ cd === - + 切换用户当前工作目录 ## 补充说明 diff --git a/LearnShell/LinuxCommands/chattr.md b/LearnShell/LinuxCommands/chattr.md old mode 100644 new mode 100755 index 9f65b5e..fb1968b --- a/LearnShell/LinuxCommands/chattr.md +++ b/LearnShell/LinuxCommands/chattr.md @@ -1,6 +1,6 @@ chattr === - + 用来改变文件属性 ## 补充说明 diff --git a/LearnShell/LinuxCommands/chgrp.md b/LearnShell/LinuxCommands/chgrp.md old mode 100644 new mode 100755 index 53ff3eb..b5919fc --- a/LearnShell/LinuxCommands/chgrp.md +++ b/LearnShell/LinuxCommands/chgrp.md @@ -1,52 +1,52 @@ -chgrp -=== - -用来变更文件或目录的所属群组 - -## 补充说明 - -**chgrp命令** 用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。 - -在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。 - -### 语法 - -``` -chgrp [选项][组群][文件|目录] -``` - -### 选项 - -``` --R 递归式地改变指定目录及其下的所有子目录和文件的所属的组 --c或——changes:效果类似“-v”参数,但仅回报更改的部分; --f或--quiet或——silent:不显示错误信息; --h或--no-dereference:只对符号连接的文件作修改,而不是该其他任何相关文件; --H如果命令行参数是一个通到目录的符号链接,则遍历符号链接 --R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理; --L遍历每一个遇到的通到目录的符号链接 --P不遍历任何符号链接(默认) --v或——verbose:显示指令执行过程; ---reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同; -``` - -### 参数 - -* 组:指定新工作名称; -* 文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。 - -### 实例 - -将`/usr/meng`及其子目录下的所有文件的用户组改为mengxin - -``` -chgrp -R mengxin /usr/meng -``` - -更改文件ah的组群所有者为newuser -``` -[root@rhel ~]# chgrp newuser ah -``` - - - +chgrp +=== + +用来变更文件或目录的所属群组 + +## 补充说明 + +**chgrp命令** 用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。 + +在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。 + +### 语法 + +``` +chgrp [选项][组群][文件|目录] +``` + +### 选项 + +``` +-R 递归式地改变指定目录及其下的所有子目录和文件的所属的组 +-c或——changes:效果类似“-v”参数,但仅回报更改的部分; +-f或--quiet或——silent:不显示错误信息; +-h或--no-dereference:只对符号连接的文件作修改,而不是该其他任何相关文件; +-H如果命令行参数是一个通到目录的符号链接,则遍历符号链接 +-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理; +-L遍历每一个遇到的通到目录的符号链接 +-P不遍历任何符号链接(默认) +-v或——verbose:显示指令执行过程; +--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同; +``` + +### 参数 + +* 组:指定新工作名称; +* 文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。 + +### 实例 + +将`/usr/meng`及其子目录下的所有文件的用户组改为mengxin + +``` +chgrp -R mengxin /usr/meng +``` + +更改文件ah的组群所有者为newuser +``` +[root@rhel ~]# chgrp newuser ah +``` + + + diff --git a/LearnShell/LinuxCommands/chkconfig.md b/LearnShell/LinuxCommands/chkconfig.md old mode 100644 new mode 100755 index 4e51502..439e1d0 --- a/LearnShell/LinuxCommands/chkconfig.md +++ b/LearnShell/LinuxCommands/chkconfig.md @@ -1,79 +1,79 @@ -chkconfig -=== - -检查或设置系统的各种服务 - -## 补充说明 - -**chkconfig命令** 检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。 - -### 语法 - -```bash -chkconfig(选项) -``` - -### 选项 - -```bash ---add:增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据; ---del:删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据; ---level<等级代号>:指定读系统服务要在哪一个执行等级中开启或关毕。 -``` -缺省的运行级,RHS用到的级别如下: - -* 0:关机 -* 1:单用户模式 -* 2:无网络支持的多用户模式 -* 3:有网络支持的多用户模式 -* 4:保留,未使用 -* 5:有网络支持有X-Window支持的多用户模式 -* 6:重新引导系统,即重启 - -对各个运行级的详细解释: - -* 0 为停机,机器关闭。 -* 1 为单用户模式,就像Win9x下的安全模式类似。 -* 2 为多用户模式,但是没有NFS支持。 -* 3 为完整的多用户模式,是标准的运行级。 -* 4 一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本 电脑的电池用尽时,可以切换到这个模式来做一些设置。 -* 5 就是X11,进到X Window系统了。 -* 6 为重启,运行init 6机器就会重启。 - -需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。 - -运行级文件: - -每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用`-`代替运行级。第二行对服务进行描述,可以用`\`跨行注释。 - -例如random.init包含三行: - -```bash -# chkconfig: 2345 20 80 -# description: Saves and restores system entropy pool for \ -# higher quality random number generation. -``` - -### 实例 - -```bash -chkconfig --list #列出所有的系统服务。 -chkconfig --add httpd #增加httpd服务。 -chkconfig --del httpd #删除httpd服务。 -chkconfig --level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态。 -chkconfig --list # 列出系统所有的服务启动情况。 -chkconfig --list mysqld # 列出mysqld服务设置情况。 -chkconfig --level 35 mysqld on # 设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭。 -chkconfig mysqld on # 设定mysqld在各等级为on,“各等级”包括2、3、4、5等级。 - -chkconfig –level redis 2345 on # 把redis在运行级别为2、3、4、5的情况下都是on(开启)的状态。 -``` - -如何增加一个服务: - -1. 服务脚本必须存放在`/etc/ini.d/`目录下; -2. `chkconfig --add servicename`在chkconfig工具服务列表中增加此服务,此时服务会被在`/etc/rc.d/rcN.d`中赋予K/S入口了; -3. `chkconfig --level 35 mysqld on`修改服务的默认启动等级。 - - - +chkconfig +=== + +检查或设置系统的各种服务 + +## 补充说明 + +**chkconfig命令** 检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。 + +### 语法 + +```bash +chkconfig(选项) +``` + +### 选项 + +```bash +--add:增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据; +--del:删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据; +--level<等级代号>:指定读系统服务要在哪一个执行等级中开启或关毕。 +``` +缺省的运行级,RHS用到的级别如下: + +* 0:关机 +* 1:单用户模式 +* 2:无网络支持的多用户模式 +* 3:有网络支持的多用户模式 +* 4:保留,未使用 +* 5:有网络支持有X-Window支持的多用户模式 +* 6:重新引导系统,即重启 + +对各个运行级的详细解释: + +* 0 为停机,机器关闭。 +* 1 为单用户模式,就像Win9x下的安全模式类似。 +* 2 为多用户模式,但是没有NFS支持。 +* 3 为完整的多用户模式,是标准的运行级。 +* 4 一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本 电脑的电池用尽时,可以切换到这个模式来做一些设置。 +* 5 就是X11,进到X Window系统了。 +* 6 为重启,运行init 6机器就会重启。 + +需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。 + +运行级文件: + +每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用`-`代替运行级。第二行对服务进行描述,可以用`\`跨行注释。 + +例如random.init包含三行: + +```bash +# chkconfig: 2345 20 80 +# description: Saves and restores system entropy pool for \ +# higher quality random number generation. +``` + +### 实例 + +```bash +chkconfig --list #列出所有的系统服务。 +chkconfig --add httpd #增加httpd服务。 +chkconfig --del httpd #删除httpd服务。 +chkconfig --level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态。 +chkconfig --list # 列出系统所有的服务启动情况。 +chkconfig --list mysqld # 列出mysqld服务设置情况。 +chkconfig --level 35 mysqld on # 设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭。 +chkconfig mysqld on # 设定mysqld在各等级为on,“各等级”包括2、3、4、5等级。 + +chkconfig –level redis 2345 on # 把redis在运行级别为2、3、4、5的情况下都是on(开启)的状态。 +``` + +如何增加一个服务: + +1. 服务脚本必须存放在`/etc/ini.d/`目录下; +2. `chkconfig --add servicename`在chkconfig工具服务列表中增加此服务,此时服务会被在`/etc/rc.d/rcN.d`中赋予K/S入口了; +3. `chkconfig --level 35 mysqld on`修改服务的默认启动等级。 + + + diff --git a/LearnShell/LinuxCommands/chmod.md b/LearnShell/LinuxCommands/chmod.md old mode 100644 new mode 100755 index 2724833..516847b --- a/LearnShell/LinuxCommands/chmod.md +++ b/LearnShell/LinuxCommands/chmod.md @@ -1,116 +1,91 @@ -chmod -=== - -用来变更文件或目录的权限 - -## 补充说明 - -**chmod命令** 用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。 - -权限范围的表示法如下: - -`u` User,即文件或目录的拥有者; -`g` Group,即文件或目录的所属群组; -`o` Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围; -`a` All,即全部的用户,包含拥有者,所属群组以及其他用户; -`r` 读取权限,数字代号为“4”; -`w` 写入权限,数字代号为“2”; -`x` 执行或切换权限,数字代号为“1”; -`-` 不具任何权限,数字代号为“0”; -`s` 特殊功能说明:变更文件或目录的权限。 - -### 语法 - -``` -chmod(选项)(参数) -``` - -### 选项 - -```bash -u # 操作对象简称,用户user,文件或目录的所有者。 -g # 操作对象简称,同组用户group,文件或目录所属群组 -o # 操作对象简称,其它用户others -a # 操作对象简称,所有用户all,系统默认使用此项 -+ # 权限操作符,添加某些权限 -- # 权限操作符,取消某些权限 -= # 权限操作符,设置文件的权限为给定的权限 -r # 权限设定(英文),表示可读权限 -w # 权限设定(英文),表示可写权限 -x # 权限设定(英文),表示可执行权限 -- # 权限设定(英文字符),表示没有权限 -X # 权限设定,如果目标文件是可执行文件或目录,可给其设置可执行权限 -s # 权限设定,设置权限suid和sgid,使用权限组合“u+s”设定文件的用户的ID位,“g+s”设置组ID位 -t # 权限设定,只有目录或文件的所有者才可以删除目录下的文件 --c或——changes # 效果类似“-v”参数,但仅回报更改的部分,如果文件权限已经改变,显示其操作信息; --f或--quiet或——silent # 操作过程中不显示任何错误信息; --R或——recursive # 递归处理,将指令目录下的所有文件及子目录一并处理; --v或——verbose # 显示命令运行时的详细执行过程; ---reference=<参考文件或目录> # 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同; -<权限范围>+<权限设置> # 开启权限范围的文件或目录的该选项权限设置; -<权限范围>-<权限设置> # 关闭权限范围的文件或目录的该选项权限设置; -<权限范围>=<权限设置> # 指定权限范围的文件或目录的该选项权限设置; ---help # 显示帮助信息 ---version # 显示版本信息 -``` - -### 参数 - -权限模式:指定文件的权限模式; -文件:要改变权限的文件。 - -### 知识扩展和实例 - -Linux用 户分为:拥有者、组群(Group)、其他(other),Linux系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及root的相关信 息, 都是记录在`/etc/passwd`文件中。每个人的密码则是记录在`/etc/shadow`文件下。 此外,所有的组群名称记录在`/etc/group`內! - -linux文件的用户权限的分析图 - -```bash - -rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules -# ↑╰┬╯╰┬╯╰┬╯ -# ┆ ┆ ┆ ╰┈ 0 其他人 -# ┆ ┆ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ g 属组 -# ┆ ╰┈┈┈┈ u 属组 -# ╰┈┈ 第一个字母 `d` 代表目录,`-` 代表普通文件 -``` - -例:rwx rw- r-- - -r=读取属性  //值=4 -w=写入属性  //值=2 -x=执行属性  //值=1 - -```bash -chmod u+x,g+w f01  # 为文件f01设置自己可以执行,组员可以写入的权限 -chmod u=rwx,g=rw,o=r f01 -chmod 764 f01 -chmod a+x f01   # 对文件f01的u,g,o都设置可执行属性 -``` - -文件的属主和属组属性设置 - -```bash -chown user:market f01  # 把文件f01给uesr,添加到market组 -ll -d f1 查看目录f1的属性 -``` - - -将`/home/wwwroot/`里的所有文件和文件夹设置为`755`权限 - -(1)直接指定路径修改 - -```bash -chmod -R 755 /home/wwwroot/* -``` - -(2)手动进入该目录修改权限(并显示详细过程) - - -```bash -cd /home/wwwroot -chmod -Rv 755 * #注意:“*”表示通配符,指的是所有文件和文件 -sudo chmod o+rw /shared #设置文件夹权限以保证其余用户可以访问它。 -``` - - - +chmod +=== + +用来变更文件或目录的权限 + +## 补充说明 + +**chmod命令** 用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。 + +权限范围的表示法如下: + +`u` User,即文件或目录的拥有者; +`g` Group,即文件或目录的所属群组; +`o` Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围; +`a` All,即全部的用户,包含拥有者,所属群组以及其他用户; +`r` 读取权限,数字代号为“4”; +`w` 写入权限,数字代号为“2”; +`x` 执行或切换权限,数字代号为“1”; +`-` 不具任何权限,数字代号为“0”; +`s` 特殊功能说明:变更文件或目录的权限。 + +### 语法 + +``` +chmod(选项)(参数) +``` + +### 选项 + +```bash +u # 操作对象简称,用户user,文件或目录的所有者。 +g # 操作对象简称,同组用户group,文件或目录所属群组 +o # 操作对象简称,其它用户others +a # 操作对象简称,所有用户all,系统默认使用此项 ++ # 权限操作符,添加某些权限 +- # 权限操作符,取消某些权限 += # 权限操作符,设置文件的权限为给定的权限 +r # 权限设定(英文),表示可读权限 +w # 权限设定(英文),表示可写权限 +x # 权限设定(英文),表示可执行权限 +- # 权限设定(英文字符),表示没有权限 +X # 权限设定,如果目标文件是可执行文件或目录,可给其设置可执行权限 +s # 权限设定,设置权限suid和sgid,使用权限组合“u+s”设定文件的用户的ID位,“g+s”设置组ID位 +t # 权限设定,只有目录或文件的所有者才可以删除目录下的文件 +-c或——changes # 效果类似“-v”参数,但仅回报更改的部分,如果文件权限已经改变,显示其操作信息; +-f或--quiet或——silent # 操作过程中不显示任何错误信息; +-R或——recursive # 递归处理,将指令目录下的所有文件及子目录一并处理; +-v或——verbose # 显示命令运行时的详细执行过程; +--reference=<参考文件或目录> # 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同; +<权限范围>+<权限设置> # 开启权限范围的文件或目录的该选项权限设置; +<权限范围>-<权限设置> # 关闭权限范围的文件或目录的该选项权限设置; +<权限范围>=<权限设置> # 指定权限范围的文件或目录的该选项权限设置; +--help # 显示帮助信息 +--version # 显示版本信息 +``` + +### 参数 + +权限模式:指定文件的权限模式; +文件:要改变权限的文件。 + +### 知识扩展和实例 + +Linux用 户分为:拥有者、组群(Group)、其他(other),Linux系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及root的相关信 息, 都是记录在`/etc/passwd`文件中。每个人的密码则是记录在`/etc/shadow`文件下。 此外,所有的组群名称记录在`/etc/group`內! + +linux文件的用户权限的分析图 + +!linux文件的用户权限的分析图 + +例:rwx rw- r-- + +r=读取属性  //值=4 +w=写入属性  //值=2 +x=执行属性  //值=1 + +```bash +chmod u+x,g+w f01  # 为文件f01设置自己可以执行,组员可以写入的权限 +chmod u=rwx,g=rw,o=r f01 +chmod 764 f01 +chmod a+x f01   # 对文件f01的u,g,o都设置可执行属性 +``` + +文件的属主和属组属性设置 + +```bash +chown user:market f01  # 把文件f01给uesr,添加到market组 +ll -d f1 查看目录f1的属性 +``` + + + diff --git a/LearnShell/LinuxCommands/chown.md b/LearnShell/LinuxCommands/chown.md old mode 100644 new mode 100755 index ac09dc1..3c681dd --- a/LearnShell/LinuxCommands/chown.md +++ b/LearnShell/LinuxCommands/chown.md @@ -1,6 +1,6 @@ chown === - + 用来变更文件或目录的拥有者或所属群组 ## 补充说明 diff --git a/LearnShell/LinuxCommands/clear.md b/LearnShell/LinuxCommands/clear.md old mode 100644 new mode 100755 index 2f86957..0887dfe --- a/LearnShell/LinuxCommands/clear.md +++ b/LearnShell/LinuxCommands/clear.md @@ -1,6 +1,6 @@ clear === - + 清除当前屏幕终端上的任何信息 ## 补充说明 diff --git a/LearnShell/LinuxCommands/clock.md b/LearnShell/LinuxCommands/clock.md old mode 100644 new mode 100755 diff --git a/LearnShell/LinuxCommands/cp.md b/LearnShell/LinuxCommands/cp.md old mode 100644 new mode 100755 index 72de046..c4157de --- a/LearnShell/LinuxCommands/cp.md +++ b/LearnShell/LinuxCommands/cp.md @@ -1,99 +1,152 @@ -cp -=== - -将源文件或目录复制到目标文件或目录中 - -## 补充说明 - -**cp命令** 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。 - -### 语法 - -``` -cp(选项)(参数) -``` - -### 选项 - -``` --a:此参数的效果和同时指定"-dpR"参数相同; --d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录; --f:强行复制文件或目录,不论目标文件或目录是否已存在; --i:覆盖既有文件之前先询问用户; --l:对源文件建立硬连接,而非复制文件; --p:保留源文件或目录的属性; --R/r:递归处理,将指定目录下的所有文件与子目录一并处理; --s:对源文件建立符号连接,而非复制文件; --u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件; --S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀; --b:覆盖已存在的文件目标前将目标文件备份; --v:详细显示命令执行的操作。 -``` - -### 参数 - -* 源文件:制定源文件列表。默认情况下,cp命令不能复制目录,如果要复制目录,则必须使用`-R`选项; -* 目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。 - -### 实例 - -下面的第一行中是 cp 命令和具体的参数(-r 是“递归”, -u 是“更新”,-v 是“详细”)。接下来的三行显示被复制文件的信息,最后一行显示命令行提示符。这样,只拷贝新的文件到我的存储设备上,我就使用 cp 的“更新”和“详细”选项。 - -通常来说,参数 `-r` 也可用更详细的风格 `--recursive`。但是以简短的方式,也可以这么连用 `-ruv`。 - -``` -cp -r -u -v /usr/men/tmp ~/men/tmp -``` - -版本备份 `--backup=numbered` 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。 - -```bash -$ cp --force --backup=numbered test1.py test1.py -$ ls -test1.py test1.py.~1~ test1.py.~2~ -``` - -如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。通常会用到点`.`或点点`..`的形式。例如,下面的命令将指定文件复制到当前目录下: - -``` -cp ../mary/homework/assign . -``` - -所有目标文件指定的目录必须是己经存在的,cp命令不能创建目录。如果没有文件复制的权限,则系统会显示出错信息。 - -将文件file复制到目录`/usr/men/tmp`下,并改名为file1 - -``` -cp file /usr/men/tmp/file1 -``` - -将目录`/usr/men`下的所有文件及其子目录复制到目录`/usr/zh`中 - -``` -cp -r /usr/men /usr/zh -``` - -交互式地将目录`/usr/men`中的以m打头的所有.c文件复制到目录`/usr/zh`中 - -``` -cp -i /usr/men m*.c /usr/zh -``` - -我们在Linux下使用cp命令复制文件时候,有时候会需要覆盖一些同名文件,覆盖文件的时候都会有提示:需要不停的按Y来确定执行覆盖。文件数量不多还好,但是要是几百个估计按Y都要吐血了,于是折腾来半天总结了一个方法: - -``` -cp aaa/* /bbb -复制目录aaa下所有到/bbb目录下,这时如果/bbb目录下有和aaa同名的文件,需要按Y来确认并且会略过aaa目录下的子目录。 - -cp -r aaa/* /bbb -这次依然需要按Y来确认操作,但是没有忽略子目录。 - -cp -r -a aaa/* /bbb -依然需要按Y来确认操作,并且把aaa目录以及子目录和文件属性也传递到了/bbb。 - -\cp -r -a aaa/* /bbb -成功,没有提示按Y、传递了目录属性、没有略过目录。 -``` - - - +cp +=== + +将源文件或目录复制到目标文件或目录中 + +## 补充说明 + +**cp命令** 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。 + +### 语法 + +``` +cp(选项)(参数) +``` + +### 选项 + +``` +用法:cp [选项]... [-T] 源文件 目标文件 + 或:cp [选项]... 源文件... 目录 + 或:cp [选项]... -t 目录 源文件... +Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. + +必选参数对长短选项同时适用。 + -a, --archive 等于-dR --preserve=all + --attributes-only 仅复制属性而不复制数据 --backup[=CONTROL 为每个已存在的目标文件创建备份 + -b 类似--backup 但不接受参数 + --copy-contents 在递归处理是复制特殊文件内容 + -d 等于--no-dereference --preserve=links,当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录; + -f, --force 强行复制文件或目录,不论目标文件或目录是否已存在强行复制文件或目录,不论目标文件或目录是否已存在 + -i, --interactive 覆盖既有文件之前先询问用户 + -H follow command-line symbolic links in SOURCE + -l, --link 对源文件建立硬连接,而非复制文件 + -L, --dereference always follow symbolic links in SOURCE + -n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效) + -P, --no-dereference 不跟随源文件中的符号链接 + -p 等于--preserve=模式,所有权,时间戳 + --preserve[=属性列表 保持指定的属性(默认:模式,所有权,时间戳),如 果 + 可能保持附加属性:环境、链接、xattr 等 + --sno-preserve=属性列表 不保留指定的文件属性 + --parents 复制前在目标目录创建来源文件路径中的所有目录 + -R, -r, --recursive 递归复制目录及其子目录内的所有内容 + --reflink[=WHEN] 控制克隆/CoW 副本。请查看下面的内如。 + --remove-destination 尝试打开目标文件前先删除已存在的目的地 + 文件 (相对于 --force 选项) + --sparse=WHEN 控制创建稀疏文件的方式 + --strip-trailing-slashes 删除参数中所有源文件/目录末端的斜杠 + -s, --symbolic-link 只创建符号链接而不复制文件 + -S, --suffix=后缀 自行指定备份文件的后缀 + -t, --target-directory=目录 将所有参数指定的源文件/目录 + 复制至目标目录 + -T, --no-target-directory 将目标目录视作普通文件 + -u, --update 只在源文件比目标文件新,或目标文件 + 不存在时才进行复制 + -v, --verbose 显示详细的进行步骤 + -x, --one-file-system 不跨越文件系统进行操作 + -Z set SELinux security context of destination + file to default type + --context[=CTX] like -Z, or if CTX is specified then set the + SELinux or SMACK security context to CTX + --help 显示此帮助信息并退出 + --version 显示版本信息并退出 + +默认情况下,源文件的稀疏性仅仅通过简单的方法判断,对应的目标文件目标文件也 +被为稀疏。这是因为默认情况下使用了--sparse=auto 参数。如果明确使用 +--sparse=always 参数则不论源文件是否包含足够长的0 序列也将目标文件创文 +建为稀疏件。 +使用--sparse=never 参数禁止创建稀疏文件。 + +当指定了--reflink[=always] 参数时执行轻量化的复制,即只在数据块被修改的 +情况下才复制。如果复制失败或者同时指定了--reflink=auto,则返回标准复制模式。 + +The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. +The version control method may be selected via the --backup option or through +the VERSION_CONTROL environment variable. Here are the values: + + none, off 不进行备份(即使使用了--backup 选项) + numbered, t 备份文件加上数字进行排序 + existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份 + simple, never 永远使用普通方式备份 + +有一个特别情况:如果同时指定--force 和--backup 选项,而源文件和目标文件 +是同一个已存在的一般文件的话,cp 会将源文件备份。 +``` + +### 参数 + +* 源文件:制定源文件列表。默认情况下,cp命令不能复制目录,如果要复制目录,则必须使用`-R`选项; +* 目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。 + +### 实例 + +下面的第一行中是 cp 命令和具体的参数(-r 是“递归”, -u 是“更新”,-v 是“详细”)。接下来的三行显示被复制文件的信息,最后一行显示命令行提示符。这样,只拷贝新的文件到我的存储设备上,我就使用 cp 的“更新”和“详细”选项。 + +通常来说,参数 `-r` 也可用更详细的风格 `--recursive`。但是以简短的方式,也可以这么连用 `-ruv`。 + +``` +cp -r -u -v /usr/men/tmp ~/men/tmp +``` + +版本备份 `--backup=numbered` 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。 + +```bash +$ cp --force --backup=numbered test1.py test1.py +$ ls +test1.py test1.py.~1~ test1.py.~2~ +``` + +如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。通常会用到点`.`或点点`..`的形式。例如,下面的命令将指定文件复制到当前目录下: + +``` +cp ../mary/homework/assign . +``` + +所有目标文件指定的目录必须是己经存在的,cp命令不能创建目录。如果没有文件复制的权限,则系统会显示出错信息。 + +将文件file复制到目录`/usr/men/tmp`下,并改名为file1 + +``` +cp file /usr/men/tmp/file1 +``` + +将目录`/usr/men`下的所有文件及其子目录复制到目录`/usr/zh`中 + +``` +cp -r /usr/men /usr/zh +``` + +交互式地将目录`/usr/men`中的以m打头的所有.c文件复制到目录`/usr/zh`中 + +``` +cp -i /usr/men m*.c /usr/zh +``` + +我们在Linux下使用cp命令复制文件时候,有时候会需要覆盖一些同名文件,覆盖文件的时候都会有提示:需要不停的按Y来确定执行覆盖。文件数量不多还好,但是要是几百个估计按Y都要吐血了,于是折腾来半天总结了一个方法: + +``` +cp aaa/* /bbb +复制目录aaa下所有到/bbb目录下,这时如果/bbb目录下有和aaa同名的文件,需要按Y来确认并且会略过aaa目录下的子目录。 + +cp -r aaa/* /bbb +这次依然需要按Y来确认操作,但是没有忽略子目录。 + +cp -r -a aaa/* /bbb +依然需要按Y来确认操作,并且把aaa目录以及子目录和文件属性也传递到了/bbb。 + +\cp -r -a aaa/* /bbb +成功,没有提示按Y、传递了目录属性、没有略过目录。 +``` + + + diff --git a/LearnShell/LinuxCommands/curl.md b/LearnShell/LinuxCommands/curl.md old mode 100644 new mode 100755 index 591540e..eecdf47 --- a/LearnShell/LinuxCommands/curl.md +++ b/LearnShell/LinuxCommands/curl.md @@ -121,7 +121,7 @@ curl(选项)(参数) ### 实例 -**文件下载** + **文件下载** curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用`yum install curl`安装,也可以下载安装。curl是将下载文件输出到stdout,将进度信息输出到stderr,不显示进度信息使用`--silent`选项。 @@ -144,7 +144,7 @@ curl http://man.linuxde.net/test.iso -o filename.iso --progress ######################################### 100.0% ``` -**断点续传** + **断点续传** curl能够从特定的文件偏移处继续下载,它可以通过指定一个便宜量来下载部分文件: @@ -155,7 +155,7 @@ curl URL/File -C 偏移量 curl -C -URL ``` -**使用curl设置参照页字符串** + **使用curl设置参照页字符串** 参照页是位于HTTP头部中的一个字符串,用来表示用户是从哪个页面到达当前页面的,如果用户点击网页A中的某个连接,那么用户就会跳转到B网页,网页B头部的参照页字符串就包含网页A的URL。 @@ -165,7 +165,7 @@ curl -C -URL curl --referer http://www.google.com http://man.linuxde.net ``` -**用curl设置cookies** + **用curl设置cookies** 使用`--cookie "COKKIES"`选项来指定cookie,多个cookie使用分号分隔: @@ -179,7 +179,7 @@ curl http://man.linuxde.net --cookie "user=root;pass=123456" curl URL --cookie-jar cookie_file ``` -**用curl设置用户代理字符串** + **用curl设置用户代理字符串** 有些网站访问会提示只能使用IE浏览器来访问,这是因为这些网站设置了检查用户代理,可以使用curl把用户代理设置为IE,这样就可以访问了。使用`--user-agent`或者`-A`选项: @@ -194,7 +194,7 @@ curl URL -A "Mozilla/5.0" curl -H "Host:man.linuxde.net" -H "accept-language:zh-cn" URL ``` -**curl的带宽控制和下载配额** + **curl的带宽控制和下载配额** 使用`--limit-rate`限制curl的下载速度: @@ -212,7 +212,7 @@ curl URL --max-filesize bytes 如果文件大小超出限制,命令则返回一个非0退出码,如果命令正常则返回0。 -**用curl进行认证** + **用curl进行认证** 使用curl选项 -u 可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码: @@ -221,7 +221,7 @@ curl -u user:pwd http://man.linuxde.net curl -u user http://man.linuxde.net ``` -**只打印响应头部信息** + **只打印响应头部信息** 通过`-I`或者`-head`可以只打印出HTTP头部信息: @@ -236,25 +236,5 @@ Vary: Accept-Encoding X-Pingback: http://man.linuxde.net/xmlrpc.php ``` -**get请求** -```bash -curl "http://www.wangchujiang.com" # 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 -curl -i "http://www.wangchujiang.com" # 显示全部信息 -curl -l "http://www.wangchujiang.com" # 只显示头部信息 -curl -v "http://www.wangchujiang.com" # 显示get请求全过程解析 -``` - -**post请求** - -```bash -curl -d "param1=value1¶m2=value2" "http://www.wangchujiang.com" -``` - -**json格式的post请求** - -```bash -curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}' http://wangchujiang.com/apis/users.json -``` - - + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/cut.md b/LearnShell/LinuxCommands/cut.md old mode 100644 new mode 100755 index 1e64082..0fb9e8e --- a/LearnShell/LinuxCommands/cut.md +++ b/LearnShell/LinuxCommands/cut.md @@ -1,6 +1,6 @@ cut === - + 连接文件并打印到标准输出设备上 ## 补充说明 diff --git a/LearnShell/LinuxCommands/date.md b/LearnShell/LinuxCommands/date.md old mode 100644 new mode 100755 index b4f28a2..ba43842 --- a/LearnShell/LinuxCommands/date.md +++ b/LearnShell/LinuxCommands/date.md @@ -1,156 +1,156 @@ -date -=== - -显示或设置系统时间与日期 - -## 补充说明 - -**date命令** 是显示或设置系统时间与日期。 - -很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。 - -### 语法 - -``` -date(选项)(参数) -``` - -### 选项 - -``` --d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; --s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; --u:显示GMT; ---help:在线帮助; ---version:显示版本信息。 -``` - -### 参数 - -<+时间日期格式>:指定显示时使用的日期时间格式。 - -### 日期格式字符串列表 - -``` -%H 小时,24小时制(00~23) -%I 小时,12小时制(01~12) -%k 小时,24小时制(0~23) -%l 小时,12小时制(1~12) -%M 分(00~59) -%p 显示出上午或下午 -%r 时间,12小时制 -%s 从1970年1月1日0点到目前经历的秒数 -%S 秒(00~59) -%T 时间(24小时制)(hh:mm:ss) -%X 显示时间的格式(%H时%M分%S秒) -%Z 按字母表排序的时区缩写 -%a 星期名缩写 -%A 星期名全称 -%b 月名缩写 -%B 月名全称 -%c 日期和时间 -%d 按月计的日期(01~31) -%D 日期(mm/dd/yy) -%h 和%b选项相同 -%j 一年的第几天(001~366) -%m 月份(01~12) -%w 一个星期的第几天(0代表星期天) -%W 一年的第几个星期(00~53,星期一为第一天) -%x 显示日期的格式(mm/dd/yy) -%y 年份的最后两个数字(1999则是99) -%Y 年份(比如1970、1996等) -%C 世纪,通常为省略当前年份的后两位数字 -%U 一年中的第几周,以周日为每星期第一天 -%e 按月计的日期,添加空格,等于%_d -``` - -### 实例 - -格式化输出: - -``` -date +"%Y-%m-%d" -2009-12-07 -``` - -输出昨天日期: - -``` -date -d "1 day ago" +"%Y-%m-%d" -2012-11-19 -``` - -2秒后输出: - -``` -date -d "2 second" +"%Y-%m-%d %H:%M.%S" -2012-11-20 14:21.31 -``` - -传说中的 1234567890 秒: - -``` -date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" -2009-02-13 23:02:30 -``` - -普通转格式: - -``` -date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" -2009/12/12 00:00.00 -``` - -apache格式转换: - -``` -date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" -2009-12-05 00:00.37 -``` - -格式转换后时间游走: - -``` -date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" -2007-12-05 00:00.37 -``` - -加减操作: - -``` -date +%Y%m%d //显示前天年月日 -date -d "+1 day" +%Y%m%d //显示前一天的日期 -date -d "-1 day" +%Y%m%d //显示后一天的日期 -date -d "-1 month" +%Y%m%d //显示上一月的日期 -date -d "+1 month" +%Y%m%d //显示下一月的日期 -date -d "-1 year" +%Y%m%d //显示前一年的日期 -date -d "+1 year" +%Y%m%d //显示下一年的日期 -``` - -设定时间: - -``` -date -s //设置当前时间,只有root权限才能设置,其他只能查看 -date -s 20120523 //设置成20120523,这样会把具体时间设置成空00:00:00 -date -s 01:01:01 //设置具体时间,不会对日期做更改 -date -s "01:01:01 2012-05-23" //这样可以设置全部时间 -date -s "01:01:01 20120523" //这样可以设置全部时间 -date -s "2012-05-23 01:01:01" //这样可以设置全部时间 -date -s "20120523 01:01:01" //这样可以设置全部时间 -``` - -有时需要检查一组命令花费的时间,举例: - -``` -#!/bin/bash - -start=$(date +%s) -nmap man.linuxde.net &> /dev/null - -end=$(date +%s) -difference=$(( end - start )) -echo $difference seconds. -``` - - - +date +=== + +显示或设置系统时间与日期 + +## 补充说明 + +**date命令** 是显示或设置系统时间与日期。 + +很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。 + +### 语法 + +``` +date(选项)(参数) +``` + +### 选项 + +``` +-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; +-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; +-u:显示GMT; +--help:在线帮助; +--version:显示版本信息。 +``` + +### 参数 + +<+时间日期格式>:指定显示时使用的日期时间格式。 + +### 日期格式字符串列表 + +``` +%H 小时,24小时制(00~23) +%I 小时,12小时制(01~12) +%k 小时,24小时制(0~23) +%l 小时,12小时制(1~12) +%M 分(00~59) +%p 显示出上午或下午 +%r 时间,12小时制 +%s 从1970年1月1日0点到目前经历的秒数 +%S 秒(00~59) +%T 时间(24小时制)(hh:mm:ss) +%X 显示时间的格式(%H时%M分%S秒) +%Z 按字母表排序的时区缩写 +%a 星期名缩写 +%A 星期名全称 +%b 月名缩写 +%B 月名全称 +%c 日期和时间 +%d 按月计的日期(01~31) +%D 日期(mm/dd/yy) +%h 和%b选项相同 +%j 一年的第几天(001~366) +%m 月份(01~12) +%w 一个星期的第几天(0代表星期天) +%W 一年的第几个星期(00~53,星期一为第一天) +%x 显示日期的格式(mm/dd/yy) +%y 年份的最后两个数字(1999则是99) +%Y 年份(比如1970、1996等) +%C 世纪,通常为省略当前年份的后两位数字 +%U 一年中的第几周,以周日为每星期第一天 +%e 按月计的日期,添加空格,等于%_d +``` + +### 实例 + +格式化输出: + +``` +date +"%Y-%m-%d" +2009-12-07 +``` + +输出昨天日期: + +``` +date -d "1 day ago" +"%Y-%m-%d" +2012-11-19 +``` + +2秒后输出: + +``` +date -d "2 second" +"%Y-%m-%d %H:%M.%S" +2012-11-20 14:21.31 +``` + +传说中的 1234567890 秒: + +``` +date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" +2009-02-13 23:02:30 +``` + +普通转格式: + +``` +date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" +2009/12/12 00:00.00 +``` + +apache格式转换: + +``` +date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" +2009-12-05 00:00.37 +``` + +格式转换后时间游走: + +``` +date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" +2007-12-05 00:00.37 +``` + +加减操作: + +``` +date +%Y%m%d //显示前天年月日 +date -d "+1 day" +%Y%m%d //显示前一天的日期 +date -d "-1 day" +%Y%m%d //显示后一天的日期 +date -d "-1 month" +%Y%m%d //显示上一月的日期 +date -d "+1 month" +%Y%m%d //显示下一月的日期 +date -d "-1 year" +%Y%m%d //显示前一年的日期 +date -d "+1 year" +%Y%m%d //显示下一年的日期 +``` + +设定时间: + +``` +date -s //设置当前时间,只有root权限才能设置,其他只能查看 +date -s 20120523 //设置成20120523,这样会把具体时间设置成空00:00:00 +date -s 01:01:01 //设置具体时间,不会对日期做更改 +date -s "01:01:01 2012-05-23" //这样可以设置全部时间 +date -s "01:01:01 20120523" //这样可以设置全部时间 +date -s "2012-05-23 01:01:01" //这样可以设置全部时间 +date -s "20120523 01:01:01" //这样可以设置全部时间 +``` + +有时需要检查一组命令花费的时间,举例: + +``` +#!/bin/bash + +start=$(date +%s) +nmap man.linuxde.net &> /dev/null + +end=$(date +%s) +difference=$(( end - start )) +echo $difference seconds. +``` + + + diff --git a/LearnShell/LinuxCommands/dd.md b/LearnShell/LinuxCommands/dd.md old mode 100644 new mode 100755 index 4487789..b83689c --- a/LearnShell/LinuxCommands/dd.md +++ b/LearnShell/LinuxCommands/dd.md @@ -9,6 +9,9 @@ dd 建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。 +其次,dd命令可以创建一个固定大小的文件如下: +dd if=/dev/zero of=/var/swap/file.swap bs=1024K count=64( linux支持K单位,unix不支持;) + ### 语法 ``` @@ -39,8 +42,6 @@ skip=<区块数>:一开始读取时,跳过指定的区块数; 1+0 records out 1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s -[root@localhost text]# du -sh sun.txt -1.1M sun.txt ``` 该命令创建了一个1M大小的文件sun.txt,其中参数解释: @@ -119,9 +120,6 @@ skip=<区块数>:一开始读取时,跳过指定的区块数; 以上命令可以看出dd命令来测试内存操作速度: -``` -1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s -``` - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/df.md b/LearnShell/LinuxCommands/df.md old mode 100644 new mode 100755 index 0514e37..7356441 --- a/LearnShell/LinuxCommands/df.md +++ b/LearnShell/LinuxCommands/df.md @@ -1,6 +1,6 @@ df === - + 显示磁盘的相关信息 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dirname.md b/LearnShell/LinuxCommands/dirname.md old mode 100644 new mode 100755 index 652dbe8..1a75c15 --- a/LearnShell/LinuxCommands/dirname.md +++ b/LearnShell/LinuxCommands/dirname.md @@ -1,6 +1,6 @@ dirname === - + 去除文件名中的非目录部分 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dmesg.md b/LearnShell/LinuxCommands/dmesg.md old mode 100644 new mode 100755 index bdbbc0f..be21352 --- a/LearnShell/LinuxCommands/dmesg.md +++ b/LearnShell/LinuxCommands/dmesg.md @@ -1,53 +1,53 @@ -dmesg -=== - -显示Linux系统启动信息 - -## 补充说明 - -**dmesg命令** 被用于检查和控制内核的环形缓冲区。kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息保存在`/var/log/dmesg`文件里。 - -### 语法 - -``` -dmesg(选项) -``` - -### 选项 - -``` --c:显示信息后,清除ring buffer中的内容; --s<缓冲区大小>:预设置为8196,刚好等于ring buffer的大小; --n:设置记录信息的层级。 -``` - -### 实例 - -``` -[root@localhost ~]# dmesg | head -Linux version 2.6.18-348.6.1.el5 (mockbuild@builder17.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Tue May 21 15:34:22 EDT 2013 -BIOS-provided physical RAM map: - BIOS-e820: 0000000000010000 - 000000000009f400 (usable) - BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved) - BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) - BIOS-e820: 0000000000100000 - 000000007f590000 (usable) - BIOS-e820: 000000007f590000 - 000000007f5e3000 (ACPI NVS) - BIOS-e820: 000000007f5e3000 - 000000007f5f0000 (ACPI data) - BIOS-e820: 000000007f5f0000 - 000000007f600000 (reserved) - BIOS-e820: 00000000e0000000 - 00000000e8000000 (reserved) -``` - -查看硬盘基础信息 - -```bash -dmesg | grep sda - -[ 2.442555] sd 0:0:0:0: [sda] 488281250 512-byte logical blocks: (250 GB/232 GiB) -[ 2.442590] sd 0:0:0:0: [sda] Write Protect is off -[ 2.442592] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00 -[ 2.442607] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA -[ 2.447533] sda: sda1 -[ 2.448503] sd 0:0:0:0: [sda] Attached SCSI disk -``` - - +dmesg +=== + +显示Linux系统启动信息 + +## 补充说明 + +**dmesg命令** 被用于检查和控制内核的环形缓冲区。kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息保存在`/var/log/dmesg`文件里。 + +### 语法 + +``` +dmesg(选项) +``` + +### 选项 + +``` +-c:显示信息后,清除ring buffer中的内容; +-s<缓冲区大小>:预设置为8196,刚好等于ring buffer的大小; +-n:设置记录信息的层级。 +``` + +### 实例 + +``` +[root@localhost ~]# dmesg | head +Linux version 2.6.18-348.6.1.el5 (mockbuild@builder17.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Tue May 21 15:34:22 EDT 2013 +BIOS-provided physical RAM map: + BIOS-e820: 0000000000010000 - 000000000009f400 (usable) + BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved) + BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) + BIOS-e820: 0000000000100000 - 000000007f590000 (usable) + BIOS-e820: 000000007f590000 - 000000007f5e3000 (ACPI NVS) + BIOS-e820: 000000007f5e3000 - 000000007f5f0000 (ACPI data) + BIOS-e820: 000000007f5f0000 - 000000007f600000 (reserved) + BIOS-e820: 00000000e0000000 - 00000000e8000000 (reserved) +``` + +查看硬盘基础信息 + +```bash +dmesg | grep sda + +[ 2.442555] sd 0:0:0:0: [sda] 488281250 512-byte logical blocks: (250 GB/232 GiB) +[ 2.442590] sd 0:0:0:0: [sda] Write Protect is off +[ 2.442592] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00 +[ 2.442607] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA +[ 2.447533] sda: sda1 +[ 2.448503] sd 0:0:0:0: [sda] Attached SCSI disk +``` + + diff --git a/LearnShell/LinuxCommands/dos2unix.md b/LearnShell/LinuxCommands/dos2unix.md old mode 100644 new mode 100755 index 227af3d..4f4939d --- a/LearnShell/LinuxCommands/dos2unix.md +++ b/LearnShell/LinuxCommands/dos2unix.md @@ -1,6 +1,6 @@ dos2unix === - + 将DOS格式文本文件转换成Unix格式 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-deb.md b/LearnShell/LinuxCommands/dpkg-deb.md old mode 100644 new mode 100755 index a0490bd..8da7ee4 --- a/LearnShell/LinuxCommands/dpkg-deb.md +++ b/LearnShell/LinuxCommands/dpkg-deb.md @@ -1,6 +1,6 @@ dpkg-deb === - + Debian Linux下的软件包管理工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-divert.md b/LearnShell/LinuxCommands/dpkg-divert.md old mode 100644 new mode 100755 index 7ab25de..3f89f17 --- a/LearnShell/LinuxCommands/dpkg-divert.md +++ b/LearnShell/LinuxCommands/dpkg-divert.md @@ -1,6 +1,6 @@ dpkg-divert === - + Debian Linux中创建并管理一个转向列表 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-preconfigure.md b/LearnShell/LinuxCommands/dpkg-preconfigure.md old mode 100644 new mode 100755 index cd4b509..faca15f --- a/LearnShell/LinuxCommands/dpkg-preconfigure.md +++ b/LearnShell/LinuxCommands/dpkg-preconfigure.md @@ -1,6 +1,6 @@ dpkg-preconfigure === - + Debian Linux中软件包安装之前询问问题 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-query.md b/LearnShell/LinuxCommands/dpkg-query.md old mode 100644 new mode 100755 index cdc4100..ab2b3a2 --- a/LearnShell/LinuxCommands/dpkg-query.md +++ b/LearnShell/LinuxCommands/dpkg-query.md @@ -1,6 +1,6 @@ dpkg-query === - + Debian Linux中软件包的查询工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-reconfigure.md b/LearnShell/LinuxCommands/dpkg-reconfigure.md old mode 100644 new mode 100755 index fbfe476..145887d --- a/LearnShell/LinuxCommands/dpkg-reconfigure.md +++ b/LearnShell/LinuxCommands/dpkg-reconfigure.md @@ -1,6 +1,6 @@ dpkg-reconfigure === - + Debian Linux中重新配制一个已经安装的软件包 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-split.md b/LearnShell/LinuxCommands/dpkg-split.md old mode 100644 new mode 100755 index 7e2e503..efba150 --- a/LearnShell/LinuxCommands/dpkg-split.md +++ b/LearnShell/LinuxCommands/dpkg-split.md @@ -1,6 +1,6 @@ dpkg-split === - + Debian Linux中将大软件包分割成小包 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-statoverride.md b/LearnShell/LinuxCommands/dpkg-statoverride.md old mode 100644 new mode 100755 index d2cccc9..0407a2a --- a/LearnShell/LinuxCommands/dpkg-statoverride.md +++ b/LearnShell/LinuxCommands/dpkg-statoverride.md @@ -1,6 +1,6 @@ dpkg-statoverride === - + Debian Linux中覆盖文件的所有权和模式 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg-trigger.md b/LearnShell/LinuxCommands/dpkg-trigger.md old mode 100644 new mode 100755 index 06f4b63..a5096d8 --- a/LearnShell/LinuxCommands/dpkg-trigger.md +++ b/LearnShell/LinuxCommands/dpkg-trigger.md @@ -1,6 +1,6 @@ dpkg-trigger === - + Debian Linux下的软件包触发器 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dpkg.md b/LearnShell/LinuxCommands/dpkg.md old mode 100644 new mode 100755 index 744fa99..3261fc0 --- a/LearnShell/LinuxCommands/dpkg.md +++ b/LearnShell/LinuxCommands/dpkg.md @@ -1,6 +1,6 @@ dpkg === - + Debian Linux系统上安装、创建和管理软件包 ## 补充说明 diff --git a/LearnShell/LinuxCommands/du.md b/LearnShell/LinuxCommands/du.md old mode 100644 new mode 100755 index 40bf384..5c46279 --- a/LearnShell/LinuxCommands/du.md +++ b/LearnShell/LinuxCommands/du.md @@ -1,6 +1,6 @@ du === - + 显示每个文件和目录的磁盘使用空间 ## 补充说明 @@ -62,18 +62,12 @@ root@localhost [test]# du 300 log2012.log ``` -查看指定目录的所占空间: +查看指定目录(etc)的所占空间: + +```sh + +du -sh /etc -``` -[root@localhost test]# du scf -4 scf/lib -4 scf/service/deploy/product -4 scf/service/deploy/info -12 scf/service/deploy -16 scf/service -4 scf/doc -4 scf/bin -32 scf ``` 显示多个文件所占空间: @@ -99,4 +93,4 @@ root@localhost [test]# du ``` - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/dump.md b/LearnShell/LinuxCommands/dump.md old mode 100644 new mode 100755 index 44bf464..5c8264b --- a/LearnShell/LinuxCommands/dump.md +++ b/LearnShell/LinuxCommands/dump.md @@ -1,6 +1,6 @@ dump === - + 用于备份ext2或者ext3文件系统 ## 补充说明 diff --git a/LearnShell/LinuxCommands/dumpe2fs.md b/LearnShell/LinuxCommands/dumpe2fs.md new file mode 100755 index 0000000..e69de29 diff --git a/LearnShell/LinuxCommands/e2fsck.md b/LearnShell/LinuxCommands/e2fsck.md old mode 100644 new mode 100755 index 1e345e3..4d43bde --- a/LearnShell/LinuxCommands/e2fsck.md +++ b/LearnShell/LinuxCommands/e2fsck.md @@ -1,4 +1,4 @@ -e2fsck +e2fsck(单用户模式执行) === 用于检查第二扩展文件系统的完整性 diff --git a/LearnShell/LinuxCommands/echo.md b/LearnShell/LinuxCommands/echo.md old mode 100644 new mode 100755 index 7dddf26..ddfc497 --- a/LearnShell/LinuxCommands/echo.md +++ b/LearnShell/LinuxCommands/echo.md @@ -1,6 +1,6 @@ echo === - + 输出指定的字符串或者变量 ## 补充说明 diff --git a/LearnShell/LinuxCommands/export.md b/LearnShell/LinuxCommands/export.md old mode 100644 new mode 100755 index 873fca8..b19ab33 --- a/LearnShell/LinuxCommands/export.md +++ b/LearnShell/LinuxCommands/export.md @@ -1,6 +1,6 @@ export === - + 设置或显示系统环境变量 ## 补充说明 diff --git a/LearnShell/LinuxCommands/expr.md b/LearnShell/LinuxCommands/expr.md old mode 100644 new mode 100755 index c851694..904e89b --- a/LearnShell/LinuxCommands/expr.md +++ b/LearnShell/LinuxCommands/expr.md @@ -7,18 +7,56 @@ expr **expr命令** 是一款表达式计算工具,使用它完成表达式的求值操作。 -expr的常用运算符: +### 语法 -* 加法运算:+ -* 减法运算:- -* 乘法运算:\* -* 除法运算:/ -* 求摸(取余)运算:% +```sh -### 语法 +用法:expr 表达式 + 或:expr 选项 + + --help 显示此帮助信息并退出 + --version 显示版本信息并退出 + +将表达式的值列印到标准输出,分隔符下面的空行可提升算式优先级。 +可用的表达式有: + + ARG1 | ARG2 若ARG1 的值不为0 或者为空,则返回ARG1,否则返回ARG2 + + ARG1 & ARG2 若两边的值都不为0 或为空,则返回ARG1,否则返回 0 + + ARG1 < ARG2 ARG1 小于ARG2 + ARG1 <= ARG2 ARG1 小于或等于ARG2 + ARG1 = ARG2 ARG1 等于ARG2 + ARG1 != ARG2 ARG1 不等于ARG2 + ARG1 >= ARG2 ARG1 大于或等于ARG2 + ARG1 > ARG2 ARG1 大于ARG2 + + ARG1 + ARG2 计算 ARG1 与ARG2 相加之和 + ARG1 - ARG2 计算 ARG1 与ARG2 相减之差 + + ARG1 * ARG2 计算 ARG1 与ARG2 相乘之积 + ARG1 / ARG2 计算 ARG1 与ARG2 相除之商 + ARG1 % ARG2 计算 ARG1 与ARG2 相除之余数 + + 字符串 : 表达式 定位字符串中匹配表达式的模式 + + match 字符串 表达式 等于"字符串 :表达式" + substr 字符串 偏移量 长度 替换字符串的子串,偏移的数值从 1 起计 + index 字符串 字符 在字符串中发现字符的地方建立下标,或者标0 + length 字符串 字符串的长度 + + TOKEN interpret TOKEN as a string, even if it is a + keyword like 'match' or an operator like '/' + + ( EXPRESSION ) value of EXPRESSION + +请注意有许多运算操作符都可能需要由 shell 先实施转义。 +如果参与运算的 ARG 自变量都是数字,比较符就会被视作数学符号,否则就是多义的。 +模式匹配会返回"\"和"\"之间被匹配的子字符串或空(null);如果未使用"\"和"\", +则会返回匹配字符数量或是 0。 + +若表达式的值既不是空也不是 0,退出状态值为 0;若表达式的值为空或为 0, +退出状态值为 1。如果表达式的句法无效,则会在出错时返回退出状态值 3。 -``` -expr(选项)(参数) ``` ### 选项 @@ -37,6 +75,9 @@ expr(选项)(参数) ``` result=`expr 2 + 3` result=$(expr $no1 + 5) + +expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。 +expr dfa : '[a-zA-Z]*' #输出是3 ``` diff --git a/LearnShell/LinuxCommands/fdisk.md b/LearnShell/LinuxCommands/fdisk.md old mode 100644 new mode 100755 index bd311c5..2bcefba --- a/LearnShell/LinuxCommands/fdisk.md +++ b/LearnShell/LinuxCommands/fdisk.md @@ -1,321 +1,321 @@ -fdisk -=== - -查看磁盘使用情况和磁盘分区 - -## 补充说明 - -**fdisk命令** 用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。 - -### 语法 - -``` -fdisk(选项)(参数) -``` - -### 选项 - -``` - -b <大小> 扇区大小(512、1024、2048或4096) - -c[=<模式>] 兼容模式:“dos”或“nondos”(默认) - -h 打印此帮助文本 - -u[=<单位>] 显示单位:“cylinders”(柱面)或“sectors”(扇区,默认) - -v 打印程序版本 - -C <数字> 指定柱面数 - -H <数字> 指定磁头数 - -S <数字> 指定每个磁道的扇区数 -``` - -### 参数 - -设备文件:指定要进行分区或者显示分区的硬盘设备文件。 - -### 实例 - -首先选择要进行操作的磁盘: - -``` -[root@localhost ~]# fdisk /dev/sdb -``` - -输入`m`列出可以执行的命令: - -``` -command (m for help): m -Command action - a toggle a bootable flag - b edit bsd disklabel - c toggle the dos compatibility flag - d delete a partition - l list known partition types - m print this menu - n add a new partition - o create a new empty DOS partition table - p print the partition table - q quit without saving changes - s create a new empty Sun disklabel - t change a partition's system id - u change display/entry units - v verify the partition table - w write table to disk and exit - x extra functionality (experts only) -``` - -输入`p`列出磁盘目前的分区情况: - -``` -Command (m for help): p - -Disk /dev/sdb: 3221 MB, 3221225472 bytes -255 heads, 63 sectors/track, 391 cylinders -Units = cylinders of 16065 * 512 = 8225280 bytes - - Device Boot Start End Blocks Id System -/dev/sdb1 1 1 8001 8e Linux LVM -/dev/sdb2 2 26 200812+ 83 Linux -``` - -输入`d`然后选择分区,删除现有分区: - -``` -Command (m for help): d -Partition number (1-4): 1 - -Command (m for help): d -Selected partition 2 -``` - -查看分区情况,确认分区已经删除: - -``` -Command (m for help): print - -Disk /dev/sdb: 3221 MB, 3221225472 bytes -255 heads, 63 sectors/track, 391 cylinders -Units = cylinders of 16065 * 512 = 8225280 bytes - - Device Boot Start End Blocks Id System - -Command (m for help): -``` - -输入`n`建立新的磁盘分区,首先建立两个主磁盘分区: - -``` -Command (m for help): n -Command action - e extended - p primary partition (1-4) -p //建立主分区 -Partition number (1-4): 1 //分区号 -First cylinder (1-391, default 1): //分区起始位置 -Using default value 1 -last cylinder or +size or +sizeM or +sizeK (1-391, default 391): 100 //分区结束位置,单位为扇区 - -Command (m for help): n //再建立一个分区 -Command action - e extended - p primary partition (1-4) -p -Partition number (1-4): 2 //分区号为2 -First cylinder (101-391, default 101): -Using default value 101 -Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置,单位为M -``` - -确认分区建立成功: - -``` -Command (m for help): p - -Disk /dev/sdb: 3221 MB, 3221225472 bytes -255 heads, 63 sectors/track, 391 cylinders -Units = cylinders of 16065 * 512 = 8225280 bytes - - Device Boot Start End Blocks Id System -/dev/sdb1 1 100 803218+ 83 Linux -/dev/sdb2 101 125 200812+ 83 Linux -``` - -再建立一个逻辑分区: - -``` -Command (m for help): n -Command action - e extended - p primary partition (1-4) -e //选择扩展分区 -Partition number (1-4): 3 -First cylinder (126-391, default 126): -Using default value 126 -Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): -Using default value 391 -``` - -确认扩展分区建立成功: - -``` -Command (m for help): p - -Disk /dev/sdb: 3221 MB, 3221225472 bytes -255 heads, 63 sectors/track, 391 cylinders -Units = cylinders of 16065 * 512 = 8225280 bytes - - Device Boot Start End Blocks Id System -/dev/sdb1 1 100 803218+ 83 Linux -/dev/sdb2 101 125 200812+ 83 Linux -/dev/sdb3 126 391 2136645 5 Extended -``` - -在扩展分区上建立两个逻辑分区: - -``` -Command (m for help): n -Command action - l logical (5 or over) - p primary partition (1-4) -l //选择逻辑分区 -First cylinder (126-391, default 126): -Using default value 126 -Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): +400M - -Command (m for help): n -Command action - l logical (5 or over) - p primary partition (1-4) -l -First cylinder (176-391, default 176): -Using default value 176 -Last cylinder or +size or +sizeM or +sizeK (176-391, default 391): -Using default value 391 -``` - -确认逻辑分区建立成功: - -``` -Command (m for help): p - -Disk /dev/sdb: 3221 MB, 3221225472 bytes -255 heads, 63 sectors/track, 391 cylinders -Units = cylinders of 16065 * 512 = 8225280 bytes - - Device Boot Start End Blocks Id System -/dev/sdb1 1 100 803218+ 83 Linux -/dev/sdb2 101 125 200812+ 83 Linux -/dev/sdb3 126 391 2136645 5 Extended -/dev/sdb5 126 175 401593+ 83 Linux -/dev/sdb6 176 391 1734988+ 83 Linux - -Command (m for help): -``` - -从上面的结果我们可以看到,在硬盘sdb我们建立了2个主分区(sdb1,sdb2),1个扩展分区(sdb3),2个逻辑分区(sdb5,sdb6) - -注意:主分区和扩展分区的磁盘号位1-4,也就是说最多有4个主分区或者扩展分区,逻辑分区开始的磁盘号为5,因此在这个实验中试没有sdb4的。 - -最后对分区操作进行保存: - -``` -Command (m for help): w -The partition table has been altered! - -Calling ioctl() to re-read partition table. -Syncing disks. -``` - -建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘。 - -在sdb1上建立ext2分区: - -``` -[root@localhost ~]# mkfs.ext2 /dev/sdb1 -mke2fs 1.39 (29-May-2006) -Filesystem label= -OS type: Linux -Block size=4096 (log=2) -Fragment size=4096 (log=2) -100576 inodes, 200804 blocks -10040 blocks (5.00%) reserved for the super user -First data block=0 -Maximum filesystem blocks=209715200 -7 block groups -32768 blocks per group, 32768 fragments per group -14368 inodes per group -Superblock backups stored on blocks: - 32768, 98304, 163840 - -Writing inode tables: done -Writing superblocks and filesystem accounting information: done - -This filesystem will be automatically checked every 32 mounts or -180 days, whichever comes first. Use tune2fs -c or -i to override. -``` - -在sdb6上建立ext3分区: - -``` -[root@localhost ~]# mkfs.ext3 /dev/sdb6 -mke2fs 1.39 (29-May-2006) -Filesystem label= -OS type: Linux -Block size=4096 (log=2) -Fragment size=4096 (log=2) -217280 inodes, 433747 blocks -21687 blocks (5.00%) reserved for the super user -First data block=0 -Maximum filesystem blocks=444596224 -14 block groups -32768 blocks per group, 32768 fragments per group -15520 inodes per group -Superblock backups stored on blocks: - 32768, 98304, 163840, 229376, 294912 - -Writing inode tables: done -Creating journal (8192 blocks): done -Writing superblocks and filesystem accounting information: done - -This filesystem will be automatically checked every 32 mounts or -180 days, whichever comes first. Use tune2fs -c or -i to override. -[root@localhost ~]# -``` - -建立两个目录`/oracle`和`/web`,将新建好的两个分区挂载到系统: - -``` -[root@localhost ~]# mkdir /oracle -[root@localhost ~]# mkdir /web -[root@localhost ~]# mount /dev/sdb1 /oracle -[root@localhost ~]# mount /dev/sdb6 /web -``` - -查看分区挂载情况: - -``` -[root@localhost ~]# df -h -文件系统 容量 已用 可用 已用% 挂载点 -/dev/mapper/VolGroup00-LogVol00 - 6.7G 2.8G 3.6G 44% / -/dev/sda1 99M 12M 82M 13% /boot -tmpfs 125M 0 125M 0% /dev/shm -/dev/sdb1 773M 808K 733M 1% /oracle -/dev/sdb6 1.7G 35M 1.6G 3% /web -``` - -如果需要每次开机自动挂载则需要修改`/etc/fstab`文件,加入两行配置: - -``` -[root@localhost ~]# vim /etc/fstab - -/dev/VolGroup00/LogVol00 / ext3 defaults 1 1 -LABEL=/boot /boot ext3 defaults 1 2 -tmpfs /dev/shm tmpfs defaults 0 0 -devpts /dev/pts devpts gid=5,mode=620 0 0 -sysfs /sys sysfs defaults 0 0 -proc /proc proc defaults 0 0 -/dev/VolGroup00/LogVol01 swap swap defaults 0 0 -/dev/sdb1 /oracle ext2 defaults 0 0 -/dev/sdb6 /web ext3 defaults 0 0 -``` - - - +fdisk +=== + +查看磁盘使用情况和磁盘分区 + +## 补充说明 + +**fdisk命令** 用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。 + +### 语法 + +``` +fdisk(选项)(参数) +``` + +### 选项 + +``` + -b <大小> 扇区大小(512、1024、2048或4096) + -c[=<模式>] 兼容模式:“dos”或“nondos”(默认) + -h 打印此帮助文本 + -u[=<单位>] 显示单位:“cylinders”(柱面)或“sectors”(扇区,默认) + -v 打印程序版本 + -C <数字> 指定柱面数 + -H <数字> 指定磁头数 + -S <数字> 指定每个磁道的扇区数 +``` + +### 参数 + +设备文件:指定要进行分区或者显示分区的硬盘设备文件。 + +### 实例 + +首先选择要进行操作的磁盘: + +``` +[root@localhost ~]# fdisk /dev/sdb +``` + +输入`m`列出可以执行的命令: + +``` +command (m for help): m +Command action + a toggle a bootable flag + b edit bsd disklabel + c toggle the dos compatibility flag + d delete a partition + l list known partition types + m print this menu + n add a new partition + o create a new empty DOS partition table + p print the partition table + q quit without saving changes + s create a new empty Sun disklabel + t change a partition's system id + u change display/entry units + v verify the partition table + w write table to disk and exit + x extra functionality (experts only) +``` + +输入`p`列出磁盘目前的分区情况: + +``` +Command (m for help): p + +Disk /dev/sdb: 3221 MB, 3221225472 bytes +255 heads, 63 sectors/track, 391 cylinders +Units = cylinders of 16065 * 512 = 8225280 bytes + + Device Boot Start End Blocks Id System +/dev/sdb1 1 1 8001 8e Linux LVM +/dev/sdb2 2 26 200812+ 83 Linux +``` + +输入`d`然后选择分区,删除现有分区: + +``` +Command (m for help): d +Partition number (1-4): 1 + +Command (m for help): d +Selected partition 2 +``` + +查看分区情况,确认分区已经删除: + +``` +Command (m for help): print + +Disk /dev/sdb: 3221 MB, 3221225472 bytes +255 heads, 63 sectors/track, 391 cylinders +Units = cylinders of 16065 * 512 = 8225280 bytes + + Device Boot Start End Blocks Id System + +Command (m for help): +``` + +输入`n`建立新的磁盘分区,首先建立两个主磁盘分区: + +``` +Command (m for help): n +Command action + e extended + p primary partition (1-4) +p //建立主分区 +Partition number (1-4): 1 //分区号 +First cylinder (1-391, default 1): //分区起始位置 +Using default value 1 +last cylinder or +size or +sizeM or +sizeK (1-391, default 391): 100 //分区结束位置,单位为扇区 + +Command (m for help): n //再建立一个分区 +Command action + e extended + p primary partition (1-4) +p +Partition number (1-4): 2 //分区号为2 +First cylinder (101-391, default 101): +Using default value 101 +Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置,单位为M +``` + +确认分区建立成功: + +``` +Command (m for help): p + +Disk /dev/sdb: 3221 MB, 3221225472 bytes +255 heads, 63 sectors/track, 391 cylinders +Units = cylinders of 16065 * 512 = 8225280 bytes + + Device Boot Start End Blocks Id System +/dev/sdb1 1 100 803218+ 83 Linux +/dev/sdb2 101 125 200812+ 83 Linux +``` + +再建立一个逻辑分区: + +``` +Command (m for help): n +Command action + e extended + p primary partition (1-4) +e //选择扩展分区 +Partition number (1-4): 3 +First cylinder (126-391, default 126): +Using default value 126 +Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): +Using default value 391 +``` + +确认扩展分区建立成功: + +``` +Command (m for help): p + +Disk /dev/sdb: 3221 MB, 3221225472 bytes +255 heads, 63 sectors/track, 391 cylinders +Units = cylinders of 16065 * 512 = 8225280 bytes + + Device Boot Start End Blocks Id System +/dev/sdb1 1 100 803218+ 83 Linux +/dev/sdb2 101 125 200812+ 83 Linux +/dev/sdb3 126 391 2136645 5 Extended +``` + +在扩展分区上建立两个逻辑分区: + +``` +Command (m for help): n +Command action + l logical (5 or over) + p primary partition (1-4) +l //选择逻辑分区 +First cylinder (126-391, default 126): +Using default value 126 +Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): +400M + +Command (m for help): n +Command action + l logical (5 or over) + p primary partition (1-4) +l +First cylinder (176-391, default 176): +Using default value 176 +Last cylinder or +size or +sizeM or +sizeK (176-391, default 391): +Using default value 391 +``` + +确认逻辑分区建立成功: + +``` +Command (m for help): p + +Disk /dev/sdb: 3221 MB, 3221225472 bytes +255 heads, 63 sectors/track, 391 cylinders +Units = cylinders of 16065 * 512 = 8225280 bytes + + Device Boot Start End Blocks Id System +/dev/sdb1 1 100 803218+ 83 Linux +/dev/sdb2 101 125 200812+ 83 Linux +/dev/sdb3 126 391 2136645 5 Extended +/dev/sdb5 126 175 401593+ 83 Linux +/dev/sdb6 176 391 1734988+ 83 Linux + +Command (m for help): +``` + +从上面的结果我们可以看到,在硬盘sdb我们建立了2个主分区(sdb1,sdb2),1个扩展分区(sdb3),2个逻辑分区(sdb5,sdb6) + +注意:主分区和扩展分区的磁盘号位1-4,也就是说最多有4个主分区或者扩展分区,逻辑分区开始的磁盘号为5,因此在这个实验中试没有sdb4的。 + +最后对分区操作进行保存: + +``` +Command (m for help): w +The partition table has been altered! + +Calling ioctl() to re-read partition table. +Syncing disks. +``` + +建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘。 + +在sdb1上建立ext2分区: + +``` +[root@localhost ~]# mkfs.ext2 /dev/sdb1 +mke2fs 1.39 (29-May-2006) +Filesystem label= +OS type: Linux +Block size=4096 (log=2) +Fragment size=4096 (log=2) +100576 inodes, 200804 blocks +10040 blocks (5.00%) reserved for the super user +First data block=0 +Maximum filesystem blocks=209715200 +7 block groups +32768 blocks per group, 32768 fragments per group +14368 inodes per group +Superblock backups stored on blocks: + 32768, 98304, 163840 + +Writing inode tables: done +Writing superblocks and filesystem accounting information: done + +This filesystem will be automatically checked every 32 mounts or +180 days, whichever comes first. Use tune2fs -c or -i to override. +``` + +在sdb6上建立ext3分区: + +``` +[root@localhost ~]# mkfs.ext3 /dev/sdb6 +mke2fs 1.39 (29-May-2006) +Filesystem label= +OS type: Linux +Block size=4096 (log=2) +Fragment size=4096 (log=2) +217280 inodes, 433747 blocks +21687 blocks (5.00%) reserved for the super user +First data block=0 +Maximum filesystem blocks=444596224 +14 block groups +32768 blocks per group, 32768 fragments per group +15520 inodes per group +Superblock backups stored on blocks: + 32768, 98304, 163840, 229376, 294912 + +Writing inode tables: done +Creating journal (8192 blocks): done +Writing superblocks and filesystem accounting information: done + +This filesystem will be automatically checked every 32 mounts or +180 days, whichever comes first. Use tune2fs -c or -i to override. +[root@localhost ~]# +``` + +建立两个目录`/oracle`和`/web`,将新建好的两个分区挂载到系统: + +``` +[root@localhost ~]# mkdir /oracle +[root@localhost ~]# mkdir /web +[root@localhost ~]# mount /dev/sdb1 /oracle +[root@localhost ~]# mount /dev/sdb6 /web +``` + +查看分区挂载情况: + +``` +[root@localhost ~]# df -h +文件系统 容量 已用 可用 已用% 挂载点 +/dev/mapper/VolGroup00-LogVol00 + 6.7G 2.8G 3.6G 44% / +/dev/sda1 99M 12M 82M 13% /boot +tmpfs 125M 0 125M 0% /dev/shm +/dev/sdb1 773M 808K 733M 1% /oracle +/dev/sdb6 1.7G 35M 1.6G 3% /web +``` + +如果需要每次开机自动挂载则需要修改`/etc/fstab`文件,加入两行配置: + +``` +[root@localhost ~]# vim /etc/fstab + +/dev/VolGroup00/LogVol00 / ext3 defaults 1 1 +LABEL=/boot /boot ext3 defaults 1 2 +tmpfs /dev/shm tmpfs defaults 0 0 +devpts /dev/pts devpts gid=5,mode=620 0 0 +sysfs /sys sysfs defaults 0 0 +proc /proc proc defaults 0 0 +/dev/VolGroup00/LogVol01 swap swap defaults 0 0 +/dev/sdb1 /oracle ext2 defaults 0 0 +/dev/sdb6 /web ext3 defaults 0 0 +``` + + + diff --git a/LearnShell/LinuxCommands/file.md b/LearnShell/LinuxCommands/file.md old mode 100644 new mode 100755 index 8c14def..207c046 --- a/LearnShell/LinuxCommands/file.md +++ b/LearnShell/LinuxCommands/file.md @@ -1,6 +1,6 @@ file === - + 用来探测给定文件的类型。 ## 补充说明 diff --git a/LearnShell/LinuxCommands/find.md b/LearnShell/LinuxCommands/find.md old mode 100644 new mode 100755 index a31afcb..05f1734 --- a/LearnShell/LinuxCommands/find.md +++ b/LearnShell/LinuxCommands/find.md @@ -1,782 +1,1251 @@ - -HTTPS://Raw.githubusercontent.com/91yun/VPN/Master/Vpn_centos_pptpd.sh - -http://go.microsoft.com/fwlink/?LinkId=616847 - - -``` -使用find和xargs可能需要系统查找具有某一特征的文件,例如文件权限、文件属主、文件长度、文件类型等,出于安全性考虑,一般系统管理任务只是为了找出一个知道存放在哪里的文件,find可以遍历当前目录甚至整个文件系统查找文件或目录。即使系统中含有网络文件系统(NFS),find命令在该文件系统中同样有效,只要你具有相应的权限。 -``` - -## 补充说明 - -**find命令** 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 - -在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。 - -### 语法 - -``` -find(选项)(参数) -``` - -find的使用格式如下: -$ find <指定目录> <指定条件> <指定动作> -- <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。 -- <指定条件>: 所要搜索的文件的特征。 -- <指定动作>: 对搜索结果进行特定的处理。 - -``` -Find命令的一般形式为: - find pathname -options [-print -exec -ok] -该命令的参数解释: - pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 - -print find命令将匹配的文件输出到标准输出。 - -exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'comm- - and'{}\;,注意{}和\;之间的空格。 - -ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 -``` - -### 选项 - -```sh --amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算; --anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录; --atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算; --cmin<分钟>:查找在指定时间之时被更改过的文件或目录; --cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; --ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算; --daystart:从本日开始计算时间; --depth:从指定目录下最深层的子目录开始查找; --expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录; --exec<执行指令>:假设find指令的回传值为True,就执行该指令; --false:将find指令的回传值皆设为False; --fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件; --follow:排除符号连接;如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。(常用选项) --fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件; --fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件; --fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件; --fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;(常用选项) --gid<群组识别码>:查找符合指定之群组识别码的文件或目录; --group<群组名称>:查找符合指定之群组名称的文件或目录;(常用选项) --help或——help:在线帮助; --ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别; --iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别; --inum:查找符合指定的inode编号的文件或目录; --ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别; --iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别; --links<连接数目>:查找符合指定的硬连接数目的文件或目录; --iname<范本样式>:指定字符串作为寻找符号连接的范本样式; --ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出; --maxdepth<目录层级>:设置最大目录层级; --mindepth<目录层级>:设置最小目录层级; --mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算; --mount:此参数的效果和指定“-xdev”相同;在查找文件时不跨越文件系统mount点。(常用选项) --mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;-mtime-n+n按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。(常用选项) --name<范本样式>:指定字符串作为寻找文件或目录的范本样式;(常用选项) --newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;-newerfile1!file2查找更改时间比文件file1新但比文件file2旧的文件。(常用选项) --nogroup:找出不属于本地主机群组识别码的文件或目录;(常用选项) --noleaf:不去考虑目录至少需拥有两个硬连接存在; --nouser:找出不属于本地主机用户识别码的文件或目录;(常用选项) --ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令; --path<范本样式>:指定字符串作为寻找目录的范本样式; --perm<权限数值>:查找符合指定的权限数值的文件或目录;(常用选项) --print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串; --print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行; --printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定; --prune:不寻找字符串作为寻找文件或目录的范本样式;如果同时使用了-depth选项,那么-prune选项将被find命令忽略。(常用选项) --regex<范本样式>:指定字符串作为寻找文件或目录的范本样式; --size<文件大小>:查找符合指定的文件大小的文件; --true:将find指令的回传值皆设为True; --type<文件类型>:只寻找符合指定的文件类型的文件;(常用选项) -诸如: - b-块设备文件。 - d-目录。 - c-字符设备文件。 - p-管道文件。 - l-符号链接文件。 - f-普通文件。 --uid<用户识别码>:查找符合指定的用户识别码的文件或目录; --used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算; --user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;(常用选项) --version或——version:显示版本信息; --xdev:将范围局限在先行的文件系统中; --xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。 -``` - -### 参数 - -起始目录:查找文件的起始目录。 - -### 实例 - -```sh -# 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容 -find . -type f -name "*" | xargs grep "140.206.111.111" -print -``` - -搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。 -find . -name 'my*' -ls - -搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。 -find . -type f -mmin -10 - -#### 根据文件或者正则表达式进行匹配 - -列出当前目录及子目录下所有文件和文件夹 - -```sh -find . -``` - -在`/home`目录下查找以.txt结尾的文件名 - -```sh -find /home -name "*.txt" -print -``` - -同上,但忽略大小写 - -```sh -find /home -iname "*.txt" -print -``` - -当前目录及子目录下查找所有以.txt和.pdf结尾的文件 - -```sh -find . \( -name "*.txt" -o -name "*.pdf" \) -print - -或 - -find . -name "*.txt" -o -name "*.pdf" -print -``` - -匹配文件路径或者文件 - -```sh -find /usr/ -path "*local*" -print -``` - -基于正则表达式匹配文件路径 - -```sh -find . -regex ".*\(\.txt\|\.pdf\)$" -print -``` - -同上,但忽略大小写 - -```sh -find . -iregex ".*\(\.txt\|\.pdf\)$" -print -``` - -想要在/etc目录中查找文件名以host开头的文件,可以用: -``` -find /etc -name "host*" -print -``` - -想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用: - -```sh -find . -name "[A-Z]*" -print -``` - -如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件: -``` -find . -name "[a-z][a-z][0--9][0--9].txt" -print -``` - -#### 否定参数 - -找出/home下不是以.txt结尾的文件 - -```sh -find /home ! -name "*.txt" -print -``` - -#### 根据文件类型进行搜索 - -```sh -find . -type 类型参数 -``` - - -类型参数列表: - -* **f** 普通文件 -* **l** 符号连接 -* **d** 目录 -* **c** 字符设备 -* **b** 块设备 -* **s** 套接字 -* **p** Fifo - -#### 基于目录深度搜索 - -向下最大深度限制为3 - -``` -find . -maxdepth 3 -type f -``` - -搜索出深度距离当前目录至少2个子目录的所有文件 - -``` -find . -mindepth 2 -type f -``` - -#### 根据文件时间戳进行搜索 - -``` -find . -type f 时间戳 -``` - -UNIX/Linux文件系统每个文件都有三种时间戳: - -* **访问时间** (-atime/天,-amin/分钟):用户最近一次访问时间。 -* **修改时间** (-mtime/天,-mmin/分钟):文件最后一次修改时间。 -* **变化时间** (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。 - -搜索最近七天内被访问过的所有文件 - -``` -find . -type f -atime -7 -``` - -搜索恰好在七天前被访问过的所有文件 - -``` -find . -type f -atime 7 -``` - -搜索超过七天内被访问过的所有文件 - -``` -find . -type f -atime +7 -``` - -搜索访问时间超过10分钟的所有文件 - -``` -find . -type f -amin +10 -``` - -找出比file.log修改时间更长的所有文件 - -``` -find . -type f -newer file.log -``` - -#### 根据文件大小进行匹配 - -``` -find . -type f -size 文件大小单元 -``` - -文件大小单元: - -* **b** —— 块(512字节) -* **c** —— 字节 -* **w** —— 字(2字节) -* **k** —— 千字节 -* **M** —— 兆字节 -* **G** —— 吉字节 - -搜索大于10KB的文件 - -``` -find . -type f -size +10k -``` - -搜索小于10KB的文件 - -``` -find . -type f -size -10k -``` - -搜索等于10KB的文件 - -``` -find . -type f -size 10k -``` - -#### 删除匹配文件 - -删除当前目录下所有.txt文件 - -``` -find . -type f -name "*.txt" -delete -``` - -#### 根据文件权限/所有权进行匹配 - -当前目录下搜索出权限为777的文件 - -``` -find . -type f -perm 777 -``` - -找出当前目录下权限不是644的php文件 - -``` -find . -type f -name "*.php" ! -perm 644 -``` - -找出当前目录用户tom拥有的所有文件 - -``` -find . -type f -user tom -``` - -找出当前目录用户组sunk拥有的所有文件 - -``` -find . -type f -group sunk -``` - -#### 借助`-exec`选项与其他命令结合使用 - -找出当前目录下所有root的文件,并把所有权更改为用户tom - -``` -find .-type f -user root -exec chown tom {} \; -``` - -上例中, **{}** 用于与 **-exec** 选项结合使用来匹配所有文件,然后会被替换为相应的文件名。 - -找出自己家目录下所有的.txt文件并删除 - -``` -find $HOME/. -name "*.txt" -ok rm {} \; -``` - -上例中, **-ok** 和 **-exec** 行为一样,不过它会给出提示,是否执行相应的操作。 - -查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中 - -``` -find . -type f -name "*.txt" -exec cat {} \;> all.txt -``` - -将30天前的.log文件移动到old目录中 - -``` -find . -type f -mtime +30 -name "*.log" -exec cp {} old \; -``` - -找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来 - -``` -find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; -``` - -因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令 - -``` --exec ./text.sh {} \; -``` - -#### 搜索但跳出指定的目录 - -查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk - -``` -find . -path "./sk" -prune -o -name "*.txt" -print -``` - -#### find其他技巧收集 - -要列出所有长度为零的文件 - -``` -find . -empty -``` - - - -2.1.2使用perm选项 -如果希望按照文件权限模式来查找文件的话,可以采用-perm选项。你可能需要找到所有用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。在使用这一选项的时候,最好使用八进制的权限表示法。 -为了在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用: -$ find . -perm 755 -print -如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们可以使用find命令的-perm选项。在八进制数字前面要加一个横杠-。在下面的命令中-perm代表按照文件权限查找,而‘007’和你在chmod命令的绝对模式中所采用的表示法完全相同。 -$ find . -perm -007 -print -2.1.3忽略某个目录 -如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。 -如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用: -$ find /apps -name "/apps/bin" -prune -o -print -2.1.4使用user和nouser选项 -如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在$HOME目录中查找文件属主为dave的文件,可以用: -$ find ~ -user dave -print -在/etc目录下查找文件属主为uucp的文件: -$ find /etc -user uucp -print -为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名;find命令能够为你完成相应的工作。例如,希望在/home目录下查找所有的这类文件,可以用: -$ find /home -nouser -print -2.1.5使用group和nogroup选项 -就像user和nouser选项一样,针对文件所属于的用户组,find命令也具有同样的选项,为了在/apps目录下查找属于accts用户组的文件,可以用: -$ find /apps -group accts -print -要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件 -$ find / -nogroup -print -2.1.6按照更改时间查找文件 -如果希望按照更改时间来查找文件,可以使用mtime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。 -希望在系统根目录下查找更改时间在5日以内的文件,可以用: -$ find/-mtime-5-print -为了在/var/adm目录下查找更改时间在3日以前的文件,可以用: -$ find /var/adm -mtime +3 -print -2.1.7查找比某个文件新或旧的文件 -如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为: -newest_file_name ! oldest_file_name -其中,!是逻辑非符号。 -这里有两个文件,它们的更改时间大约相差两天。 --rwxr-x-r-x 1 root root 92 Apr 18 11:18 age.awk --rwxrwxr-x 1 root root 1045 Apr 20 19:37 belts.awk -下面给出的find命令能够查找更改时间比文件age.awk新但比文件belts.awk旧的文件: -$ find . -newer age.awk ! -newer belts.awk -exec ls -l {} \; --rwxrwxr-x 1 root root 62 Apr 18 11:32 ./who.awk --rwxr-xr-x 1 root root 49 Apr 18 12:05 ./group.awk --rw-r--r-- 1 root root 201 Apr 20 19:30 ./grade2.txt --rwxrwxr-x 1 root root 1054 Apr 20 19:37 ./belts.awk -如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用touch命令来实现。 -假设现在的时间是23:40,希望查找更改时间在两个小时以内的文件,可以首先创建这样一个文件: -$ touch -t 05042140 dstamp --rw-r--r-- 1 dave admin 0 May 4 21:40 dstamp -一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间是21:40,比现在刚好早两个小时。 -现在我们就可以使用find命令的-newer选项在当前目录下查找所有更改时间在两个小时以内的文件: -$find . -newer dstamp -print -2.1.8使用type选项 -UNIX或LINUX系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了介绍,这里就不再赘述。如果要在/etc目录下查找所有的目录,可以用: -$find /etc -type d -print -为了在当前目录下查找除目录以外的所有类型的文件,可以用: -$find . ! -type d -print -为了在/etc目录下查找所有的符号链接文件,可以用: -$find /etc -type l -print -2.1.9 -使用size选项可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为Nc;以块计量文件长度只用数字表示即可。 -就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,大多数人都喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,除非是在查看文件系统的大 -小,因为这时使用块来计量更容易转换。 -为了在当前目录下查找文件长度大于1M字节的文件,可以用: -$find . -size +1000000c -print -为了在/home/apache目录下查找文件长度恰好为100字节的文件,可以用: -$find /home /apache -size 100c -print -为了在当前目录下查找长度超过10块的文件(一块等于512字节),可以用: -$find . -size +10 -print -2.1.10使用depth选项 -在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。 -在下面的例子中,find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。它将首先匹配所有的文件然后再进入子目录中查找。 -$find / -name "CON.FILE" -depth -print -2.1.11使用mount选项 -在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以XC结尾的文件: -$find . -name "*.XC" -mount -print -2.1.12使用cpio选项 -cpio命令可以用来向磁带设备备份文件或从中恢复文件。可以使用find命令在整个文件系统中(更多的情况下是在部分文件系统中)查找文件,然后用cpio命令将其备份到磁带上。 -如果希望使用cpio命令备份/etc、/home和/apps目录中的文件,可以使用下面所给出的命令,不过要记住你是在文件系统的根目录下: -$ cd / -$ find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0 -(在上面的例子中,第一行末尾的\告诉shell命令还未结束,忽略\后面的回车。) -在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/etc,那么在恢复时,就只能恢复到/etc目录中去,别无其他选择。在上面的例子中,我告诉find命令首先进入/etc目录,然后是/home和/apps目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。 -顺便说一下,在上面的例子中cpio命令使用了C65536选项,我本可以使用B选项,不过这样每块的大小只有512字节,而使用了C65536选项后,块的大小变成了64K字节(65536/1024)。 -2.1.13使用exec或ok来执行shell命令 -当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用-exec选项。一旦find命令匹配到了相应的文件,就可以用-exec选项中的命令对其进行操作(在有些操作系统中只允许-exec选项执行诸如ls或ls-l这样的命令)。大多数用户使用这一选项是为了查找旧文件并删除它们。这里我强烈地建议你在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 -exec选项后面跟随着所要执行的命令,然后是一对儿{},一个空格和一个\,最后是一个分号。 -为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。 -为了用ls-l命令列出所匹配到的文件,可以把ls-l命令放在find命令的-exec选项中,例如: -$ find . -type f -exec ls-l {} \; --rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/C80 --rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Normal --rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Revvid -上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls-l命令将它们列出。 -为了在/logs目录中查找更改时间在5日以前的文件并删除它们,可以用: -$ find logs -type f -mtime +5 -exec rm {} \; -记住,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心! -当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。在下面的例子中,find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 -$ find . -name “*.LOG” -mtime +5 -ok rm {} \; - ?y -按y键删除文件,按n键不删除。 -任何形式的命令都可以在-exec选项中使用。在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个rounder用户。 -$ find /etc -name “passwd*” -exec grep “rounder” {} \; -rounder:JL9TtUqk8EHwc:500:500::/home/apps/nets/rounder:/bin/sh -2.1.14find命令的例子 -我们已经介绍了find命令的基本选项,下面给出find命令的一些其他的例子。 -为了匹配$HOME目录下的所有文件,下面两种方法都可以使用: -$ find $HOME -print -$ find ~ -print -为了在当前目录中查找suid置位,文件属主具有读、写、执行权限,并且文件所属组的用户和其他用户具有读和执行的权限的文件,可以用: -$ find . -type f -perm 4755 -print -为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用: -$ find / -type f -size 0 -exec ls-l {} \; -为了查找/var/logs目录中更改时间在7日以前的普通文件,并删除它们,可以用: -$ find /var/logs -type f -mtime +7 -exec rm {} \; -为了查找系统中所有属于audit组的文件,可以用: -$ find / -name -group audit -print -我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,这样我们一眼就可以看出哪个文件是最新的,哪个是最旧的。Admin.log文件编上了序号:admin.log.001、admin.log.002等等。下面的find命令将删除/logs目录中访问时间在7日以前、含有数字后缀的admin.log文件。该命令只检查三位数字,所以相应日志文件的后缀不要超过999。 -$ find / logs -name 'admin.log[0-9][0-9]' [-0a-t9i]me +7 -exec rm {} \; -为了查找当前文件系统中的所有目录并排序,可以用: -$ find . -type d -print -local -mount | sort -为了查找系统中所有的rmt磁带设备,可以用: -$ find /dev/rmt -print -2.2xargs -在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 -让我们来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 -下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件: -$ find / -type f -print | xargs file -/etc/protocols: Enghlish text -/etc/securetty: ASCII test -… -下面的例子在整个系统中查找内存信息转储文件(coredump),然后把结果保存到/tmp/core.log文件中: -$ find . -name "core" -print | xargs echo "" >/tmp/core.log -下面的例子在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限: -$ find /apps/audit -perm -7 -print | xargs chmod o -w -在下面的例子中,我们用grep命令在所有的普通文件中搜索device这个词: -$ find / -type f -print | xargs grep "device" -在下面的例子中,我们用grep命令在当前目录下的所有普通文件中搜索DBO这个词: -$ find . -name *\ -type f -print | xargs grep "DBO" -注意,在上面的例子中,\用来取消find命令中的*在shell中的特殊含义。 -find简单示例 -(1) find . -type f -exec ls -l {} \; -解释:查找当前路径下的所有普通文件,并把它们列出来。 -(2)find logs -type f -mtime +5 -exec rm {} \; -解释:删除logs目录下更新时间为5日以上的文件。 -(3)find . -name "*.log" -mtime +5 -ok rm {} \; -解释:删除当前路径下以。log结尾的五日以上的文件,删除之前要确认。 -(4) find ~ -type f -perm 4755 -print -解释:查找$HOME目录下suid位被设置,文件属性为755的文件打印出来。 -说明: find在有点系统中会一次性得到将匹配到的文件都传给exec,但是有的系统对exec的命令长度做限制,就会报:”参数列太长“,这就需要使用xargs。xargs是部分取传来的文件。 -(5)find / -type f -print |xargs file -解释:xargs测试文件分类 -(6)find . -name "core*" -print|xargs echo " ">/tmp/core.log -解释:将core文件信息查询结果报存到core。log日志。 -(7)find / -type f -print | xargs chmod o -w -(8)find . -name * -print |xargs grep "DBO" -find用法小结 -1. 通过文件的特征查找: -1) 按文件名 -find / -name httpd.conf -find /usr -name httpd.conf -find /etc -name '*srm*' -2) 按大小 -find / -size 1500c # 查找文件大小为1,500 bytes的文件,字符 c 表明这个要查找的文件的大小是以bytes为单位。 -find/ -size +10000000c # "+”是表示要求系统只列出大于指定大小的文件, "-”表示小于 -find / -empty # 查找在系统中为空的文件或者文件夹 --size:表示文件大小,+表示大于某个数,-表示小于某个数。c表示单位是字节,你可以将c换成k,M,G。 -3) 按时间 -find / -amin -10 # 查找在系统中最后10分钟访问的文件 -find / -atime -2 # 查找在系统中最后48小时访问的文件 -find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 -find / -mtime -1 # 查找在系统中最后24小时里修改过的文件 -find / -cmin -5 # 查找在系统中最后5分钟里被改变状态的文件 -find / -ctime -1 # 查找在系统中最后24小时里被改变状态的文件 -访问过用amin,修改过用mmin,文件状态改变过用cmin -精确到分钟的用amin,mmin,cmin,精确到天的用atime,mtime,ctime -在5分钟之内的用-5,在5分钟以上的用+5 -4) 按用户 -find / -user fred # 查找在系统中属于FRED这个用户的文件 -find / -group cat # 查找在系统中属于 groupcat的文件 -find / -nouser # 查找在系统中属于作废用户的文件 -5) 其他 --false 查找系统中总是错误的文件 --fstype type 查找系统中存在于指定文件系统的文件,例如:ext2 . --gid n 查找系统中文件数字组 ID 为 n的文件 --group gname 查找系统中文件属于gnam文件组,并且指定组和ID的文件 -2. 通过文件的特征查找: -Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。 -选项 用途描述 --daystart . .测试系统从今天开始24小时以内的文件,用法类似-amin --depth 使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容 --follow 遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询 --maxdepth levels 在某个层次的目录中按照递减方法查找 --mount 不在文件系统目录中查找, 用法类似 -xdev. --noleaf 禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找 --help 显示命令摘要 --version 打印版本数字 -使用-follow选项后,find命令则遵循通配符链接方式进行查uuuu找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。 --maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令 -find . -maxdepth 2 -name fred -假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在./sub1/sub2 /fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。 -3. 使用混合查找方式: -find /tmp -size +10000000c -and -mtime +2 // -and -find / -user fred -or -user george // -or 在/tmp目录中查找属于fred或者george这两个用户的文件 -find /tmp ! -user panda // -or 在/tmp目录中查找所有不属于panda的文件 -命令就可以解决了。很简单。 -查找并显示文件的方法 -查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性, -find / -name "httpd.conf" -ls -下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法 -选项 用途描述 --exec command; 查找并执行命令 --fprint file 打印文件完整文件名 --fprint0 file 打印文件完整文件名包括空的文件 --fprintf file format 打印文件格式 --ok command; 给用户命令执行操作,根据用户的Y 确认输入执行 --printf format 打印文件格式 --ls 打印同种文件格式的文件. -2. 普通用户无错误查找: -find / -name access_log 2>/dev/null -说明:当普通用户使用"find”命令来查询某些没有相应权限文件目录时(Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式) -往往会出现"Permissiondenied."(禁止访问)字样。 2>/dev/null就是表明系统将把错误信息输送到stderrstream 2中. --exec command; -删除一个目录中的全部文件 -cd “目的目录” -find . -name * -exec rm -f {} \; --exec 参数后面跟的是 command命令,注意如下几点: -1) command命令的终止,使用 ';' (分号)来判定,在后面必须有一个 ';' -出于不明原因, ';'需要用'\'来转义 ,所以命令整体形式为: -exec rm -f {} \; -2) '{}',使用{}来表示文件名,也就是find前面处理过程中过滤出来的文件,用于command命令进行处理 -1.查询所有保护字符串“Hello”的文件 -find / -exec grep "Hello" {} \; -2.删除所有临时文件 -find / -name "*.tmp" -exec rm -f {} \; -3. 使用混合查找方式: -find /tmp -size +10000000c -and -mtime +2 // -and -find / -user fred -or -user george // -or 在/tmp目录中查找属于fred或者george这两个用户的文件 -find /tmp ! -user panda // -or 在/tmp目录中查找所有不属于panda的文件 -find /tmp ! \( -user 0 -o -user 500 -o -user 501 \) -exec ls -l {} \; -把用户名改成UID就可以了 -find命令使用经验 -find pathname -options [-print -exec -ok] -pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 --print find命令将匹配的文件输出到标准输出。 --exec find命令对匹配的文件执行该参数所给出的shell命令。 -相应命令的形式为'command'{} \;,注意{}和\;之间的空格。 --ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 -文件状态判断: --mtime: 指定时间文件内容被修改过 --ctime: 指定时间文件权限被修改过 --atime: 指定时间文件被读取过 -找出3天“以前”被修改过的文档 -# find /var/log/ -mtime +3 -type f -print -找出3天“内”被修改过的文档 -# find /var/log/ -mtime -3 -type f -print -找出第3天被修改过的文档. -# find /var/log/ -mtime 3 -type f -print -或这样写: -#find /var/log/ -mtime +2 -mtime -4 -type f -print -注: -访问过用amin,修改过用mmin,文件状态改变过用cmin -精确到分钟的用amin,mmin,cmin,精确到天的用atime,mtime,ctime -xargs - build and execute command lines from standard input -在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。 -find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。 -在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; -而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 -来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 -下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 -#find . -type f -print | xargs file -./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text -./.kde/Autostart/.directory: ISO-8859 text\ -...... -在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中: -$ find / -name "core" -print | xargs echo "" >/tmp/core.log -上面这个执行太慢,我改成在当前目录下查找 -#find . -name "file*" -print | xargs echo "" > /temp/core.log -# cat /temp/core.log -./file6 -在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限: -# ls -l -drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6 --rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf --rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf -# find . -perm -7 -print | xargs chmod o-w -# ls -l -drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6 --rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf --rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf -用grep命令在所有的普通文件中搜索hostname这个词: -# find . -type f -print | xargs grep "hostname" -./httpd1.conf:# different IP addresses or hostnames and have them handled by the -./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames -on your -用grep命令在当前目录下的所有普通文件中搜索hostnames这个词: -# find . -name \* -type f -print | xargs grep "hostnames" -./httpd1.conf:# different IP addresses or hostnames and have them handled by the -./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames -on your -注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。 -find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令 -使用exec或ok来执行shell命令 -使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的 -在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 -exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。 -例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中 -# find . -type f -exec ls -l { } \; --rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf --rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic --rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README -上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。 -在/logs目录中查找更改时间在5日以前的文件并删除它们: -$ find logs -type f -mtime +5 -exec rm { } \; -记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。 -在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 -$ find . -name "*.conf" -mtime +5 -ok rm { } \; -< rm ... ./conf/httpd.conf > ? n -按y键删除文件,按n键不删除。 -任何形式的命令都可以在-exec选项中使用。 -在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。 -# find /etc -name "passwd*" -exec grep "sam" { } \; -sam:x:501:501::/usr/sam:/bin/bash -find 命令用法 -find / -name access_log 2>/dev/null -find /etc -name ‘*srm*’ -find / -amin -10 # 查找在系统中最后10分钟访问的文件 -find / -atime -2 # 查找在系统中最后48小时访问的文件 -find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 -find / -mtime -1 #查找在系统中最后24小时里修改过的文件 -find / -cmin -5 # 查找在系统中最后5分钟里被改变状态的文件 -find / -ctime -1 #查找在系统中最后24小时里被改变状态的文件 -find / -user reda #查找在系统中属于fred这个用户的文件 -find / -not -user reda #查找在系统中不属于FRED这个用户的文件 -find / -group redagrp # 查找在系统中属于redagrp组的文件 -find / -gid 501 #查找系统中属于组id为501的文件 -find / -user fred -a -group redagrp -find / -user reda -o -user tracy -find / -nouser #查找在系统中属于作废用户的文件 -find / -empty # 查找在系统中为空的文件或者为空的文件夹 -find / -false #查找系统中总是错误的文件 -find / -size +5k #查找系统中大于5k字节的文件 -find / -size +5c #查找系统中大于5字节的文件 -find / -perm +6000 -find / -type b -文件类型: -b 块(缓冲)设备. -c 字符设备. -d 目录. -p 有名管道(FIFO). -f 规则文件. -l 符号链结. -s SOCKET. -find / -maxdepth 2 -name fred -find /tmp -size +10000000c -and -mtime +2 -find / -user reda -or -user tracy -find /tmp ! -user reda -find / -name "httpd.conf" -ls -find / -user reda -exec ls -l {} \; -find / -user reda -ok #确认后执行 -find / -user reda | xargs ls -l -6.2 使用|| -使用||的一般形式为: -命令1 || 命令2 -||的作用有一些不同。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了|| 那么就执行这个命令”。 -这里有一个使用||的简单例子: -$ cp wopper.txt wopper.bak || echo “if you are seeing this cp failed” -cp: wopper.txt: No such file or directory -if you are seeing this cp failed -在上面的例子中,拷贝命令没有能够被成功执行,因此||后面的命令被执行。 -这里有一个更为实用的例子。我希望从一个审计文件中抽取第1个和第5个域,并将其输出到一个临时文件中,如果这一操作未成功,我希望能够收到一个相应邮件: -$ awk ‘{print $5}’ acc.qtr > qtr.tmp || echo “Sorry the payroll extraction didn’t work” | mail dave -在这里不只可以使用系统命令;这里我们首先对month_end.txt文件执行了一个名为comet的shell脚本,如果该脚本未执行成功,该shell将结束。 -$ comet month_end.txt || exit -6.3 用()和{}将命令结合在一起 -如果希望把几个命令合在一起执行, shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。 -为了在当前shell中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令用圆括号()括起来。 -它的一般形式为: -(命令1;命令2;. . .) -如果使用{ }来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。它的一般形式为: -{命令1;命令2;. . . } -我很少单独使用这两种方法。我一般只和&&或||一起使用这两种方法。 -再回到前面那个comet脚本的例子,如果这个脚本执行失败了,我很可能会希望执行两个以上的命令,而不只是一个命令。我可以使用这两种方法。这是原先那个例子: -$ comet month_end.txt || exit -现在如果该脚本执行失败了,我希望先给自己发个邮件,然后再退出,可以用下面的方法来实现: -$ comet month_end || (echo “Hello, guess what! Comet did not work”|mail dave;exit) -在上面的例子中,如果只使用了命令分隔符而没有把它们组合在一起,shell将直接执行最后一个命令(exit)。 -我们再回头来看看前面那个使用&&排序的例子,下面是原来的那个例子: -$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted -使用命令组合的方法,如果sort命令执行成功了,可以先将输出文件拷贝到一个日志区,然后再打印。 -6.4 小结 -在编写shell脚本时,使用&&和||对构造判断语句非常有用。如果希望在前一个命令执行失败的情况不执行后面的命令,那么本章所讲述的方法非常简单有效。使用这样的方法,可以根据&&或||前面命令的返回值来控制其后面命令的执行。 \ No newline at end of file +find +=== + +```txt +使用find和xargs可能需要系统查找具有某一特征的文件,例如文件权限、文件属主、文件长度、文件类型等,出于安全性考虑,一般系统管理任务只是为了找出一个知道存放在哪里的文件,find可以遍历当前目录甚至整个文件系统查找文件或目录。即使系统中含有网络文件系统(NFS),find命令在该文件系统中同样有效,只要你具有相应的权限。 +``` + +## 补充说明 + +**find命令** 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 + +在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。 + +### 语法 + +```sh +find(选项)(参数) + +find的使用格式如下: +$ find <指定目录> <指定条件> <指定动作> +- <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。 +- <指定条件>: 所要搜索的文件的特征。 +- <指定动作>: 对搜索结果进行特定的处理。 + +find 命令格式: +1、find命令的一般形式为; +2、find命令的参数; +3、find命令选项; +4、使用exec或ok来执行shell命令; +``` + +```sh +Find命令的一般形式为: + find pathname -options [-print -exec -ok] +该命令的参数解释: + pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 + -print find命令将匹配的文件输出到标准输出。 + -exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'comm- + and'{}\;,注意{}和\;之间的空格。 + -ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 +``` + +### 选项 + +```sh +-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算; +-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录; +-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算; +-cmin<分钟>:查找在指定时间之时被更改过的文件或目录; +-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; +-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算; +-daystart:从本日开始计算时间; +-depth:从指定目录下最深层的子目录开始查找; +-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录; +-exec<执行指令>:假设find指令的回传值为True,就执行该指令; +-false:将find指令的回传值皆设为False; +-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件; +-follow:排除符号连接;如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。(常用选项) +-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件; +-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件; +-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件; +-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;(常用选项) +-gid<群组识别码>:查找符合指定之群组识别码的文件或目录; +-group<群组名称>:查找符合指定之群组名称的文件或目录;(常用选项) +-help或——help:在线帮助; +-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别; +-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别; +-inum:查找符合指定的inode编号的文件或目录; +-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别; +-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别; +-links<连接数目>:查找符合指定的硬连接数目的文件或目录; +-iname<范本样式>:指定字符串作为寻找符号连接的范本样式; +-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出; +-maxdepth<目录层级>:设置最大目录层级; +-mindepth<目录层级>:设置最小目录层级; +-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算; +-mount:此参数的效果和指定“-xdev”相同;在查找文件时不跨越文件系统mount点。(常用选项) +-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;-mtime-n+n按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。(常用选项) +-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;(常用选项) +-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;-newerfile1!file2查找更改时间比文件file1新但比文件file2旧的文件。(常用选项) +-nogroup:找出不属于本地主机群组识别码的文件或目录;(常用选项) +-noleaf:不去考虑目录至少需拥有两个硬连接存在; +-nouser:找出不属于本地主机用户识别码的文件或目录;(常用选项) +-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令; +-path<范本样式>:指定字符串作为寻找目录的范本样式; +-perm<权限数值>:查找符合指定的权限数值的文件或目录;(常用选项) +-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串; +-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行; +-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定; +-prune:不寻找字符串作为寻找文件或目录的范本样式;如果同时使用了-depth选项,那么-prune选项将被find命令忽略。(常用选项) +-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式; +-size<文件大小>:查找符合指定的文件大小的文件; +-true:将find指令的回传值皆设为True; +-type<文件类型>:只寻找符合指定的文件类型的文件;(常用选项) +诸如: + b-块设备文件。 + d-目录。 + c-字符设备文件。 + p-管道文件。 + l-符号链接文件。 + f-普通文件。 +-uid<用户识别码>:查找符合指定的用户识别码的文件或目录; +-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算; +-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;(常用选项) +-version或——version:显示版本信息; +-xdev:将范围局限在先行的文件系统中; +-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。 +``` + +### 参数 + +起始目录:查找文件的起始目录。 + +### 实例 + +```sh +# 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容 +find . -type f -name "*" | xargs grep "140.206.111.111" -print +``` + +搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。 +find . -name 'my*' -ls + +搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。 +find . -type f -mmin -10 + +#### 根据文件或者正则表达式进行匹配 + +列出当前目录及子目录下所有文件和文件夹 + +```sh +find . +``` + +在`/home`目录下查找以.txt结尾的文件名 + +```sh +find /home -name "*.txt" -print +``` + +同上,但忽略大小写 + +```sh +find /home -iname "*.txt" -print +``` + +当前目录及子目录下查找所有以.txt和.pdf结尾的文件 + +```sh +find . \( -name "*.txt" -o -name "*.pdf" \) -print + +或 + +find . -name "*.txt" -o -name "*.pdf" -print +``` + +匹配文件路径或者文件 + +```sh +find /usr/ -path "*local*" -print +``` + +基于正则表达式匹配文件路径 + +```sh +find . -regex ".*\(\.txt\|\.pdf\)$" -print +``` + +同上,但忽略大小写 + +```sh +find . -iregex ".*\(\.txt\|\.pdf\)$" -print +``` + +想要在/etc目录中查找文件名以host开头的文件,可以用: +``` +find /etc -name "host*" -print +``` + +想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用: + +```sh +find . -name "[A-Z]*" -print +``` + +如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件: +``` +find . -name "[a-z][a-z][0--9][0--9].txt" -print +``` + +Find命令查找指定文件并执行删除操作 +``` +find ./ -name "文件名" -exec rm -f {}\; +``` + +#### 否定参数 + +找出/home下不是以.txt结尾的文件 + +```sh +find /home ! -name "*.txt" -print +``` + +#### 根据文件类型进行搜索 + +```sh +find . -type 类型参数 +``` + + +类型参数列表: + +* **f** 普通文件 +* **l** 符号连接 +* **d** 目录 +* **c** 字符设备 +* **b** 块设备 +* **s** 套接字 +* **p** Fifo + +#### 基于目录深度搜索 + +向下最大深度限制为3 + +``` +find . -maxdepth 3 -type f +``` + +搜索出深度距离当前目录至少2个子目录的所有文件 + +``` +find . -mindepth 2 -type f +``` + +#### 根据文件时间戳进行搜索 + +``` +find . -type f 时间戳 +``` + +UNIX/Linux文件系统每个文件都有三种时间戳: + +* **访问时间** (-atime/天,-amin/分钟):用户最近一次访问时间。 +* **修改时间** (-mtime/天,-mmin/分钟):文件最后一次修改时间。 +* **变化时间** (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。 + +搜索最近七天内被访问过的所有文件 + +``` +find . -type f -atime -7 +``` + +搜索恰好在七天前被访问过的所有文件 + +``` +find . -type f -atime 7 +``` + +搜索超过七天内被访问过的所有文件 + +``` +find . -type f -atime +7 +``` + +搜索访问时间超过10分钟的所有文件 + +``` +find . -type f -amin +10 +``` + +找出比file.log修改时间更长的所有文件 + +``` +find . -type f -newer file.log +``` + +#### 根据文件大小进行匹配 + +``` +find . -type f -size 文件大小单元 +``` + +文件大小单元: + +* **b** —— 块(512字节) +* **c** —— 字节 +* **w** —— 字(2字节) +* **k** —— 千字节 +* **M** —— 兆字节 +* **G** —— 吉字节 + +搜索大于10KB的文件 + +``` +find . -type f -size +10k +``` + +搜索小于10KB的文件 + +``` +find . -type f -size -10k +``` + +搜索等于10KB的文件 + +``` +find . -type f -size 10k +``` + +#### 删除匹配文件 + +删除当前目录下所有.txt文件 + +``` +find . -type f -name "*.txt" -delete +``` + +#### 根据文件权限/所有权进行匹配 + +当前目录下搜索出权限为777的文件 + +``` +find . -type f -perm 777 +``` + +找出当前目录下权限不是644的php文件 + +``` +find . -type f -name "*.php" ! -perm 644 +``` + +找出当前目录用户tom拥有的所有文件 + +``` +find . -type f -user tom +``` + +找出当前目录用户组sunk拥有的所有文件 + +``` +find . -type f -group sunk +``` + +#### 借助`-exec`选项与其他命令结合使用 + +找出当前目录下所有root的文件,并把所有权更改为用户tom + +``` +find .-type f -user root -exec chown tom {} \; +``` + +上例中, **{}** 用于与 **-exec** 选项结合使用来匹配所有文件,然后会被替换为相应的文件名。 + +找出自己家目录下所有的.txt文件并删除 + +``` +find $HOME/. -name "*.txt" -ok rm {} \; +``` + +上例中, **-ok** 和 **-exec** 行为一样,不过它会给出提示,是否执行相应的操作。 + +查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中 + +``` +find . -type f -name "*.txt" -exec cat {} \;> all.txt +``` + +将30天前的.log文件移动到old目录中 + +``` +find . -type f -mtime +30 -name "*.log" -exec cp {} old \; +``` + +找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来 + +``` +find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; +``` + +因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令 + +``` +-exec ./text.sh {} \; +``` + +#### 搜索但跳出指定的目录 + +查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk + +``` +find . -path "./sk" -prune -o -name "*.txt" -print +``` + +#### find其他技巧收集 + +要列出所有长度为零的文件 + +``` +find . -empty +``` + +#### 删除指定文件夹下后缀名相同的文件 + +```sh +方法一: +find 目录 -name "*.abc" | xargs rm +命令有点危险,可以先执行前半段,看看是不是你要删除的文件, 然后再整条执行 + +方法二: +find . -name '*.exe' -type f -print -exec rm -rf {} \; +(1) "." 表示从当前目录开始递归查找 +(2) “ -name '*.exe' "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件 +(3) " -type f "查找的类型为文件 +(4) "-print" 输出查找的文件目录名 +(5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。 +exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号 +``` + +#### 如何找出设置了SET位的权限的文件? + +```sh +ls -lh $(find / -type f -perm +6000) +find / -type f -perm +6000 -exec ls -lh {} \; +命令含义介绍: +-perm +6000 表示不检查基本权限(000),只要附加权限中匹配任何一位(6包含了4、2)即满足条件;结合“ls -lh”命令是为了同时显示出结果文件的详细属性 +两种方法的区别在于:前者使用了Shell的命令替换操作( $() 符号或者反撇号 ``),只有在find命令执行完毕后才能看到结果;而后一种方法则每找到一条结果就立即显示出来了 +``` + + + +#### 暂未整理一 + +```sh + +2.1.2使用perm选项 +如果希望按照文件权限模式来查找文件的话,可以采用-perm选项。你可能需要找到所有用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。在使用这一选项的时候,最好使用八进制的权限表示法。 +为了在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用: +$ find . -perm 755 -print +如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们可以使用find命令的-perm选项。在八进制数字前面要加一个横杠-。在下面的命令中-perm代表按照文件权限查找,而‘007’和你在chmod命令的绝对模式中所采用的表示法完全相同。 +$ find . -perm -007 -print +2.1.3忽略某个目录 +如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。 +如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用: +$ find /apps -name "/apps/bin" -prune -o -print +2.1.4使用user和nouser选项 +如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在$HOME目录中查找文件属主为dave的文件,可以用: +$ find ~ -user dave -print +在/etc目录下查找文件属主为uucp的文件: +$ find /etc -user uucp -print +为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名;find命令能够为你完成相应的工作。例如,希望在/home目录下查找所有的这类文件,可以用: +$ find /home -nouser -print +2.1.5使用group和nogroup选项 +就像user和nouser选项一样,针对文件所属于的用户组,find命令也具有同样的选项,为了在/apps目录下查找属于accts用户组的文件,可以用: +$ find /apps -group accts -print +要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件 +$ find / -nogroup -print +2.1.6按照更改时间查找文件 +如果希望按照更改时间来查找文件,可以使用mtime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。 +希望在系统根目录下查找更改时间在5日以内的文件,可以用: +$ find/-mtime-5-print +为了在/var/adm目录下查找更改时间在3日以前的文件,可以用: +$ find /var/adm -mtime +3 -print +2.1.7查找比某个文件新或旧的文件 +如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为: +newest_file_name ! oldest_file_name +其中,!是逻辑非符号。 +这里有两个文件,它们的更改时间大约相差两天。 +-rwxr-x-r-x 1 root root 92 Apr 18 11:18 age.awk +-rwxrwxr-x 1 root root 1045 Apr 20 19:37 belts.awk +下面给出的find命令能够查找更改时间比文件age.awk新但比文件belts.awk旧的文件: +$ find . -newer age.awk ! -newer belts.awk -exec ls -l {} \; +-rwxrwxr-x 1 root root 62 Apr 18 11:32 ./who.awk +-rwxr-xr-x 1 root root 49 Apr 18 12:05 ./group.awk +-rw-r--r-- 1 root root 201 Apr 20 19:30 ./grade2.txt +-rwxrwxr-x 1 root root 1054 Apr 20 19:37 ./belts.awk +如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用touch命令来实现。 +假设现在的时间是23:40,希望查找更改时间在两个小时以内的文件,可以首先创建这样一个文件: +$ touch -t 05042140 dstamp +-rw-r--r-- 1 dave admin 0 May 4 21:40 dstamp +一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间是21:40,比现在刚好早两个小时。 +现在我们就可以使用find命令的-newer选项在当前目录下查找所有更改时间在两个小时以内的文件: +$find . -newer dstamp -print +2.1.8使用type选项 +UNIX或LINUX系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了介绍,这里就不再赘述。如果要在/etc目录下查找所有的目录,可以用: +$find /etc -type d -print +为了在当前目录下查找除目录以外的所有类型的文件,可以用: +$find . ! -type d -print +为了在/etc目录下查找所有的符号链接文件,可以用: +$find /etc -type l -print +2.1.9 +使用size选项可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为Nc;以块计量文件长度只用数字表示即可。 +就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,大多数人都喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,除非是在查看文件系统的大 +小,因为这时使用块来计量更容易转换。 +为了在当前目录下查找文件长度大于1M字节的文件,可以用: +$find . -size +1000000c -print +为了在/home/apache目录下查找文件长度恰好为100字节的文件,可以用: +$find /home /apache -size 100c -print +为了在当前目录下查找长度超过10块的文件(一块等于512字节),可以用: +$find . -size +10 -print +2.1.10使用depth选项 +在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。 +在下面的例子中,find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。它将首先匹配所有的文件然后再进入子目录中查找。 +$find / -name "CON.FILE" -depth -print +2.1.11使用mount选项 +在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以XC结尾的文件: +$find . -name "*.XC" -mount -print +2.1.12使用cpio选项 +cpio命令可以用来向磁带设备备份文件或从中恢复文件。可以使用find命令在整个文件系统中(更多的情况下是在部分文件系统中)查找文件,然后用cpio命令将其备份到磁带上。 +如果希望使用cpio命令备份/etc、/home和/apps目录中的文件,可以使用下面所给出的命令,不过要记住你是在文件系统的根目录下: +$ cd / +$ find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0 +(在上面的例子中,第一行末尾的\告诉shell命令还未结束,忽略\后面的回车。) +在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/etc,那么在恢复时,就只能恢复到/etc目录中去,别无其他选择。在上面的例子中,我告诉find命令首先进入/etc目录,然后是/home和/apps目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。 +顺便说一下,在上面的例子中cpio命令使用了C65536选项,我本可以使用B选项,不过这样每块的大小只有512字节,而使用了C65536选项后,块的大小变成了64K字节(65536/1024)。 +2.1.13使用exec或ok来执行shell命令 +当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用-exec选项。一旦find命令匹配到了相应的文件,就可以用-exec选项中的命令对其进行操作(在有些操作系统中只允许-exec选项执行诸如ls或ls-l这样的命令)。大多数用户使用这一选项是为了查找旧文件并删除它们。这里我强烈地建议你在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 +exec选项后面跟随着所要执行的命令,然后是一对儿{},一个空格和一个\,最后是一个分号。 +为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。 +为了用ls-l命令列出所匹配到的文件,可以把ls-l命令放在find命令的-exec选项中,例如: +$ find . -type f -exec ls-l {} \; +-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/C80 +-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Normal +-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Revvid +上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls-l命令将它们列出。 +为了在/logs目录中查找更改时间在5日以前的文件并删除它们,可以用: +$ find logs -type f -mtime +5 -exec rm {} \; +记住,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心! +当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。在下面的例子中,find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 +$ find . -name “*.LOG” -mtime +5 -ok rm {} \; + ?y +按y键删除文件,按n键不删除。 +任何形式的命令都可以在-exec选项中使用。在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个rounder用户。 +$ find /etc -name “passwd*” -exec grep “rounder” {} \; +rounder:JL9TtUqk8EHwc:500:500::/home/apps/nets/rounder:/bin/sh +2.1.14find命令的例子 +我们已经介绍了find命令的基本选项,下面给出find命令的一些其他的例子。 +为了匹配$HOME目录下的所有文件,下面两种方法都可以使用: +$ find $HOME -print +$ find ~ -print +为了在当前目录中查找suid置位,文件属主具有读、写、执行权限,并且文件所属组的用户和其他用户具有读和执行的权限的文件,可以用: +$ find . -type f -perm 4755 -print +为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用: +$ find / -type f -size 0 -exec ls-l {} \; +为了查找/var/logs目录中更改时间在7日以前的普通文件,并删除它们,可以用: +$ find /var/logs -type f -mtime +7 -exec rm {} \; +为了查找系统中所有属于audit组的文件,可以用: +$ find / -name -group audit -print +我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,这样我们一眼就可以看出哪个文件是最新的,哪个是最旧的。Admin.log文件编上了序号:admin.log.001、admin.log.002等等。下面的find命令将删除/logs目录中访问时间在7日以前、含有数字后缀的admin.log文件。该命令只检查三位数字,所以相应日志文件的后缀不要超过999。 +$ find / logs -name 'admin.log[0-9][0-9]' [-0a-t9i]me +7 -exec rm {} \; +为了查找当前文件系统中的所有目录并排序,可以用: +$ find . -type d -print -local -mount | sort +为了查找系统中所有的rmt磁带设备,可以用: +$ find /dev/rmt -print +2.2xargs +在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 +让我们来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 +下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件: +$ find / -type f -print | xargs file +/etc/protocols: Enghlish text +/etc/securetty: ASCII test +… +下面的例子在整个系统中查找内存信息转储文件(coredump),然后把结果保存到/tmp/core.log文件中: +$ find . -name "core" -print | xargs echo "" >/tmp/core.log +下面的例子在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限: +$ find /apps/audit -perm -7 -print | xargs chmod o -w +在下面的例子中,我们用grep命令在所有的普通文件中搜索device这个词: +$ find / -type f -print | xargs grep "device" +在下面的例子中,我们用grep命令在当前目录下的所有普通文件中搜索DBO这个词: +$ find . -name *\ -type f -print | xargs grep "DBO" +注意,在上面的例子中,\用来取消find命令中的*在shell中的特殊含义。 +find简单示例 +(1) find . -type f -exec ls -l {} \; +解释:查找当前路径下的所有普通文件,并把它们列出来。 +(2)find logs -type f -mtime +5 -exec rm {} \; +解释:删除logs目录下更新时间为5日以上的文件。 +(3)find . -name "*.log" -mtime +5 -ok rm {} \; +解释:删除当前路径下以。log结尾的五日以上的文件,删除之前要确认。 +(4) find ~ -type f -perm 4755 -print +解释:查找$HOME目录下suid位被设置,文件属性为755的文件打印出来。 +说明: find在有点系统中会一次性得到将匹配到的文件都传给exec,但是有的系统对exec的命令长度做限制,就会报:”参数列太长“,这就需要使用xargs。xargs是部分取传来的文件。 +(5)find / -type f -print |xargs file +解释:xargs测试文件分类 +(6)find . -name "core*" -print|xargs echo " ">/tmp/core.log +解释:将core文件信息查询结果报存到core。log日志。 +(7)find / -type f -print | xargs chmod o -w +(8)find . -name * -print |xargs grep "DBO" +find用法小结 +1. 通过文件的特征查找: +1) 按文件名 +find / -name httpd.conf +find /usr -name httpd.conf +find /etc -name '*srm*' +2) 按大小 +find / -size 1500c # 查找文件大小为1,500 bytes的文件,字符 c 表明这个要查找的文件的大小是以bytes为单位。 +find/ -size +10000000c # "+”是表示要求系统只列出大于指定大小的文件, "-”表示小于 +find / -empty # 查找在系统中为空的文件或者文件夹 +-size:表示文件大小,+表示大于某个数,-表示小于某个数。c表示单位是字节,你可以将c换成k,M,G。 +3) 按时间 +find / -amin -10 # 查找在系统中最后10分钟访问的文件 +find / -atime -2 # 查找在系统中最后48小时访问的文件 +find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 +find / -mtime -1 # 查找在系统中最后24小时里修改过的文件 +find / -cmin -5 # 查找在系统中最后5分钟里被改变状态的文件 +find / -ctime -1 # 查找在系统中最后24小时里被改变状态的文件 +访问过用amin,修改过用mmin,文件状态改变过用cmin +精确到分钟的用amin,mmin,cmin,精确到天的用atime,mtime,ctime +在5分钟之内的用-5,在5分钟以上的用+5 +4) 按用户 +find / -user fred # 查找在系统中属于FRED这个用户的文件 +find / -group cat # 查找在系统中属于 groupcat的文件 +find / -nouser # 查找在系统中属于作废用户的文件 +5) 其他 +-false 查找系统中总是错误的文件 +-fstype type 查找系统中存在于指定文件系统的文件,例如:ext2 . +-gid n 查找系统中文件数字组 ID 为 n的文件 +-group gname 查找系统中文件属于gnam文件组,并且指定组和ID的文件 +2. 通过文件的特征查找: +Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。 +选项 用途描述 +-daystart . .测试系统从今天开始24小时以内的文件,用法类似-amin +-depth 使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容 +-follow 遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询 +-maxdepth levels 在某个层次的目录中按照递减方法查找 +-mount 不在文件系统目录中查找, 用法类似 -xdev. +-noleaf 禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找 +-help 显示命令摘要 +-version 打印版本数字 +使用-follow选项后,find命令则遵循通配符链接方式进行查uuuu找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。 +-maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令 +find . -maxdepth 2 -name fred +假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在./sub1/sub2 /fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。 +3. 使用混合查找方式: +find /tmp -size +10000000c -and -mtime +2 // -and +find / -user fred -or -user george // -or 在/tmp目录中查找属于fred或者george这两个用户的文件 +find /tmp ! -user panda // -or 在/tmp目录中查找所有不属于panda的文件 +命令就可以解决了。很简单。 +查找并显示文件的方法 +查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性, +find / -name "httpd.conf" -ls +下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法 +选项 用途描述 +-exec command; 查找并执行命令 +-fprint file 打印文件完整文件名 +-fprint0 file 打印文件完整文件名包括空的文件 +-fprintf file format 打印文件格式 +-ok command; 给用户命令执行操作,根据用户的Y 确认输入执行 +-printf format 打印文件格式 +-ls 打印同种文件格式的文件. +2. 普通用户无错误查找: +find / -name access_log 2>/dev/null +说明:当普通用户使用"find”命令来查询某些没有相应权限文件目录时(Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式) +往往会出现"Permissiondenied."(禁止访问)字样。 2>/dev/null就是表明系统将把错误信息输送到stderrstream 2中. +-exec command; +删除一个目录中的全部文件 +cd “目的目录” +find . -name * -exec rm -f {} \; +-exec 参数后面跟的是 command命令,注意如下几点: +1) command命令的终止,使用 ';' (分号)来判定,在后面必须有一个 ';' +出于不明原因, ';'需要用'\'来转义 ,所以命令整体形式为: -exec rm -f {} \; +2) '{}',使用{}来表示文件名,也就是find前面处理过程中过滤出来的文件,用于command命令进行处理 +1.查询所有保护字符串“Hello”的文件 +find / -exec grep "Hello" {} \; +2.删除所有临时文件 +find / -name "*.tmp" -exec rm -f {} \; +3. 使用混合查找方式: +find /tmp -size +10000000c -and -mtime +2 // -and +find / -user fred -or -user george // -or 在/tmp目录中查找属于fred或者george这两个用户的文件 +find /tmp ! -user panda // -or 在/tmp目录中查找所有不属于panda的文件 +find /tmp ! \( -user 0 -o -user 500 -o -user 501 \) -exec ls -l {} \; +把用户名改成UID就可以了 +find命令使用经验 +find pathname -options [-print -exec -ok] +pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 +-print find命令将匹配的文件输出到标准输出。 +-exec find命令对匹配的文件执行该参数所给出的shell命令。 +相应命令的形式为'command'{} \;,注意{}和\;之间的空格。 +-ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 +文件状态判断: +-mtime: 指定时间文件内容被修改过 +-ctime: 指定时间文件权限被修改过 +-atime: 指定时间文件被读取过 +找出3天“以前”被修改过的文档 +# find /var/log/ -mtime +3 -type f -print +找出3天“内”被修改过的文档 +# find /var/log/ -mtime -3 -type f -print +找出第3天被修改过的文档. +# find /var/log/ -mtime 3 -type f -print +或这样写: +#find /var/log/ -mtime +2 -mtime -4 -type f -print +注: +访问过用amin,修改过用mmin,文件状态改变过用cmin +精确到分钟的用amin,mmin,cmin,精确到天的用atime,mtime,ctime +xargs - build and execute command lines from standard input +在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。 +find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。 +在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; +而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 +来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 +下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 +#find . -type f -print | xargs file +./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text +./.kde/Autostart/.directory: ISO-8859 text\ +...... +在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中: +$ find / -name "core" -print | xargs echo "" >/tmp/core.log +上面这个执行太慢,我改成在当前目录下查找 +#find . -name "file*" -print | xargs echo "" > /temp/core.log +# cat /temp/core.log +./file6 +在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限: +# ls -l +drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6 +-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf +-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf +# find . -perm -7 -print | xargs chmod o-w +# ls -l +drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6 +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf +用grep命令在所有的普通文件中搜索hostname这个词: +# find . -type f -print | xargs grep "hostname" +./httpd1.conf:# different IP addresses or hostnames and have them handled by the +./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames +on your +用grep命令在当前目录下的所有普通文件中搜索hostnames这个词: +# find . -name \* -type f -print | xargs grep "hostnames" +./httpd1.conf:# different IP addresses or hostnames and have them handled by the +./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames +on your +注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。 +find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令 +使用exec或ok来执行shell命令 +使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的 +在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 +exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。 +例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中 +# find . -type f -exec ls -l { } \; +-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf +-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic +-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README +上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。 +在/logs目录中查找更改时间在5日以前的文件并删除它们: +$ find logs -type f -mtime +5 -exec rm { } \; +记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。 +在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 +$ find . -name "*.conf" -mtime +5 -ok rm { } \; +< rm ... ./conf/httpd.conf > ? n +按y键删除文件,按n键不删除。 +任何形式的命令都可以在-exec选项中使用。 +在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。 +# find /etc -name "passwd*" -exec grep "sam" { } \; +sam:x:501:501::/usr/sam:/bin/bash +find 命令用法 +find / -name access_log 2>/dev/null +find /etc -name ‘*srm*’ +find / -amin -10 # 查找在系统中最后10分钟访问的文件 +find / -atime -2 # 查找在系统中最后48小时访问的文件 +find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 +find / -mtime -1 #查找在系统中最后24小时里修改过的文件 +find / -cmin -5 # 查找在系统中最后5分钟里被改变状态的文件 +find / -ctime -1 #查找在系统中最后24小时里被改变状态的文件 +find / -user reda #查找在系统中属于fred这个用户的文件 +find / -not -user red #查找在系统中不属于red这个用户的文件 +find / -group redagrp # 查找在系统中属于redagrp组的文件 +find / -gid 501 #查找系统中属于组id为501的文件 +find / -user fred -a -group redagrp +find / -user reda -o -user tracy +find / -nouser #查找在系统中属于作废用户的文件 +find / -empty # 查找在系统中为空的文件或者为空的文件夹 +find / -false #查找系统中总是错误的文件 +find / -size +5k #查找系统中大于5k字节的文件 +find / -size +5c #查找系统中大于5字节的文件 +find / -perm +6000 +find / -type b +文件类型: +b 块(缓冲)设备. +c 字符设备. +d 目录. +p 有名管道(FIFO). +f 规则文件. +l 符号链结. +s SOCKET. +find / -maxdepth 2 -name fred +find /tmp -size +10000000c -and -mtime +2 +find / -user reda -or -user tracy +find /tmp ! -user reda +find / -name "httpd.conf" -ls +find / -user reda -exec ls -l {} \; +find / -user reda -ok #确认后执行 +find / -user reda | xargs ls -l +6.2 使用|| +使用||的一般形式为: +命令1 || 命令2 +||的作用有一些不同。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了|| 那么就执行这个命令”。 +这里有一个使用||的简单例子: +$ cp wopper.txt wopper.bak || echo “if you are seeing this cp failed” +cp: wopper.txt: No such file or directory +if you are seeing this cp failed +在上面的例子中,拷贝命令没有能够被成功执行,因此||后面的命令被执行。 +这里有一个更为实用的例子。我希望从一个审计文件中抽取第1个和第5个域,并将其输出到一个临时文件中,如果这一操作未成功,我希望能够收到一个相应邮件: +$ awk ‘{print $5}’ acc.qtr > qtr.tmp || echo “Sorry the payroll extraction didn’t work” | mail dave +在这里不只可以使用系统命令;这里我们首先对month_end.txt文件执行了一个名为comet的shell脚本,如果该脚本未执行成功,该shell将结束。 +$ comet month_end.txt || exit +6.3 用()和{}将命令结合在一起 +如果希望把几个命令合在一起执行, shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。 +为了在当前shell中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令用圆括号()括起来。 +它的一般形式为: +(命令1;命令2;. . .) +如果使用{ }来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。它的一般形式为: +{命令1;命令2;. . . } +我很少单独使用这两种方法。我一般只和&&或||一起使用这两种方法。 +再回到前面那个comet脚本的例子,如果这个脚本执行失败了,我很可能会希望执行两个以上的命令,而不只是一个命令。我可以使用这两种方法。这是原先那个例子: +$ comet month_end.txt || exit +现在如果该脚本执行失败了,我希望先给自己发个邮件,然后再退出,可以用下面的方法来实现: +$ comet month_end || (echo “Hello, guess what! Comet did not work”|mail dave;exit) +在上面的例子中,如果只使用了命令分隔符而没有把它们组合在一起,shell将直接执行最后一个命令(exit)。 +我们再回头来看看前面那个使用&&排序的例子,下面是原来的那个例子: +$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted +使用命令组合的方法,如果sort命令执行成功了,可以先将输出文件拷贝到一个日志区,然后再打印。 +6.4 小结 +在编写shell脚本时,使用&&和||对构造判断语句非常有用。如果希望在前一个命令执行失败的情况不执行后面的命令,那么本章所讲述的方法非常简单有效。使用这样的方法,可以根据&&或||前面命令的返回值来控制其后面命令的执行。 +``` + +#### 暂未整理二 + +```sh + +一、find 命令格式 + + +1、find命令的一般形式为; + +find pathname -options [-print -exec -ok ...] + +2、find命令的参数; + +pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 +-print: find命令将匹配的文件输出到标准输出。 +-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格。 +-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 + +3、find命令选项 + +-name + +按照文件名查找文件。 + +-perm +按照文件权限来查找文件。 + +-prune +使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。 + +-user +按照文件属主来查找文件。 + +-group +按照文件所属的组来查找文件。 + +-mtime -n +n +按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。 + +-nogroup +查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。 + +-nouser +查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。 +-newer file1 ! file2 + +查找更改时间比文件file1新但比文件file2旧的文件。 +-type + +查找某一类型的文件,诸如: + +b - 块设备文件。 +d - 目录。 +c - 字符设备文件。 +p - 管道文件。 +l - 符号链接文件。 +f - 普通文件。 + +-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。 +-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。 +-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。 + +-mount:在查找文件时不跨越文件系统mount点。 +-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。 +-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。 +另外,下面三个的区别: + +-amin n +查找系统中最后N分钟访问的文件 + +-atime n +查找系统中最后n*24小时访问的文件 + +-cmin n +查找系统中最后N分钟被改变文件状态的文件 + +-ctime n +查找系统中最后n*24小时被改变文件状态的文件 + +-mmin n +查找系统中最后N分钟被改变文件数据的文件 + +-mtime n +查找系统中最后n*24小时被改变文件数据的文件 + +4、使用exec或ok来执行shell命令 + +使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的 + +在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 + +exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。 + +例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中 + +# find . -type f -exec ls -l {} \; +-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf +-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic +-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README +上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。 +在/logs目录中查找更改时间在5日以前的文件并删除它们: + +$ find logs -type f -mtime +5 -exec rm {} \; +记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。 + +在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 + +$ find . -name "*.log" -mtime +5 -ok rm {} \; +< rm ... ./conf/httpd.conf > ? n +按y键删除文件,按n键不删除。 + +任何形式的命令都可以在-exec选项中使用。 + +在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。 + +# find /etc -name "passwd*" -exec grep "sam" {} \; +sam:x:501:501::/usr/sam:/bin/bash + +二、find命令的例子; + + +1、查找当前用户主目录下的所有文件: + +下面两种方法都可以使用 + +$ find $HOME -print +$ find ~ -print + +2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件; + +$ find . -type f -perm 644 -exec ls -l {} \; + +3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径; + +$ find / -type f -size 0 -exec ls -l {} \; + +4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们; + +$ find /var/logs -type f -mtime +7 -ok rm {} \; + +5、为了查找系统中所有属于root组的文件; + +$find . -group root -exec ls -l {} \; +-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1 + +6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。 + +该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令 + +$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok +rm {} \; +< rm ... ./admin.log001 > ? n +< rm ... ./admin.log002 > ? n +< rm ... ./admin.log042 > ? n +< rm ... ./admin.log942 > ? n + +7、为了查找当前文件系统中的所有目录并排序; + +$ find . -type d | sort + +8、为了查找系统中所有的rmt磁带设备; + +$ find /dev/rmt -print + +三、xargs + +xargs – build and execute command lines from standard input + +在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。 + +find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。 + +在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; + +而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 + +来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 + +下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 + +#find . -type f -print | xargs file +./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text +./.kde/Autostart/.directory: ISO-8859 text\ +...... +在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中: + +$ find / -name "core" -print | xargs echo "" >/tmp/core.log +上面这个执行太慢,我改成在当前目录下查找 + +#find . -name "file*" -print | xargs echo "" > /temp/core.log +# cat /temp/core.log +./file6 +在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限: + +# ls -l +drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6 +-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf +-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf + +# find . -perm -7 -print | xargs chmod o-w +# ls -l +drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6 +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf +用grep命令在所有的普通文件中搜索hostname这个词: + +# find . -type f -print | xargs grep "hostname" +./httpd1.conf:# different IP addresses or hostnames and have them handled by the +./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames +on your +用grep命令在当前目录下的所有普通文件中搜索hostnames这个词: + +# find . -name \* -type f -print | xargs grep "hostnames" +./httpd1.conf:# different IP addresses or hostnames and have them handled by the +./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames +on your +注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。 + +find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。 + + +四、find 命令的参数 + +下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册 + + +1、使用name选项 + +文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。 + +可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。 + +不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为 ‘pathname’参数,波浪号~代表了你的$HOME目录。 + +$ find ~ -name "*.txt" -print +想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用: + +$ find . -name "*.txt" -print +想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用: + +$ find . -name "[A-Z]*" -print +想要在/etc目录中查找文件名以host开头的文件,可以用: + +$ find /etc -name "host*" -print +想要查找$HOME目录中的文件,可以用: + +$ find ~ -name "*" -print 或find . -print +要想让系统高负荷运行,就从根目录开始查找所有的文件。 + +$ find / -name "*" -print +如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件: + +$find . -name "[a-z][a-z][0--9][0--9].txt" -print + +2、用perm选项 + +按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。 + +如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用: + +$ find . -perm 755 -print +还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666 + +# ls -l +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf +-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf +drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam +-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp + +# find . -perm 006 +# find . -perm -006 +./sam +./httpd1.conf +./temp +-perm mode:文件许可正好符合mode + +-perm +mode:文件许可部分符合mode + +-perm -mode: 文件许可完全符合mode + + +3、忽略某个目录 + +如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。 + +如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用: + +$ find /apps -path "/apps/bin" -prune -o -print + +4、使用find查找文件的时候怎么避开某个文件目录 + +比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件 + +find /usr/sam -path "/usr/sam/dir1" -prune -o -print +find [-path ..] [expression] 在路径列表的后面的是表达式 +-path “/usr/sam” -prune -o -print 是 -path “/usr/sam” -a -prune -o +-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path “/usr/sam” 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path “/usr/sam” -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。 + +这个表达式组合特例可以用伪码写为 + +if -path "/usr/sam" then +-prune +else +-print +避开多个文件夹 + +find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print +圆括号表示表达式的结合。 + +\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。 +查找某一确定文件,-name等选项加在-o 之后 + +#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print + +5、使用user和nouser选项 + +按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用: + +$ find ~ -user sam -print +在/etc目录下查找文件属主为uucp的文件: + +$ find /etc -user uucp -print +为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。 + +例如,希望在/home目录下查找所有的这类文件,可以用: + +$ find /home -nouser -print + +6、使用group和nogroup选项 + +就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用: + +$ find /apps -group gem -print +要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件 + +$ find / -nogroup-print + +7、按照更改时间或访问时间等查找文件 + +如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。 + +用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。 + +希望在系统根目录下查找更改时间在5日以内的文件,可以用: + +$ find / -mtime -5 -print +为了在/var/adm目录下查找更改时间在3日以前的文件,可以用: + +$ find /var/adm -mtime +3 -print + +8、查找比某个文件新或旧的文件 + +如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为: + +newest_file_name ! oldest_file_name +其中,!是逻辑非符号。 + +查找更改时间比文件sam新但比文件temp旧的文件: + +例:有两个文件 + +-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel +-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf +-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf +drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam +-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp + +# find -newer httpd1.conf ! -newer temp -ls +1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf +1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp +1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel +查找更改时间在比temp文件新的文件: + +$ find . -newer temp -print + +9、使用type选项 + +在/etc目录下查找所有的目录,可以用: + +$ find /etc -type d -print +在当前目录下查找除目录以外的所有类型的文件,可以用: + +$ find . ! -type d -print +在/etc目录下查找所有的符号链接文件,可以用 + +$ find /etc -type l -print + +10、使用size选项 + +可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。 + +在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。 +在当前目录下查找文件长度大于1 M字节的文件: + +$ find . -size +1000000c -print +查找当前目录中大于10M的文件: + +find . -size +10000k -exec ls -ld {} ; +将find出来的文件复制到另一个地方: + +find *.c -exec cp '{}' /tmp ';' +在/home/apache目录下查找文件长度恰好为100字节的文件: + +$ find /home/apache -size 100c -print +在当前目录下查找长度超过10块的文件(一块等于512字节): + +$ find . -size +10 -print + +11、使用depth选项 + +在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。 + +在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。 + +它将首先匹配所有的文件然后再进入子目录中查找。 + +$ find / -name "CON.FILE" -depth -print + +12、使用mount选项 + +在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。 + +从当前目录开始查找位于本文件系统中文件名以XC结尾的文件: + +$ find . -name "*.XC" -mount -print + +``` \ No newline at end of file diff --git a/LearnShell/LinuxCommands/free.md b/LearnShell/LinuxCommands/free.md old mode 100644 new mode 100755 index deb9cfa..f36144f --- a/LearnShell/LinuxCommands/free.md +++ b/LearnShell/LinuxCommands/free.md @@ -1,159 +1,159 @@ -free -=== - -显示内存的使用情况 - -## 补充说明 - -**free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 - -### 语法 - -``` -free(选项) -``` - -### 选项 - -```bash --b # 以Byte为单位显示内存使用情况; --k # 以KB为单位显示内存使用情况; --m # 以MB为单位显示内存使用情况; --g # 以GB为单位显示内存使用情况。 --o # 不显示缓冲区调节列; --s<间隔秒数> # 持续观察内存使用状况; --t # 显示内存总和列; --V # 显示版本信息。 -``` - -### 实例 - -```bash -free -t # 以总和的形式显示内存的使用信息 -free -s 10 # 周期性的查询内存使用信息,每10s 执行一次命令 -``` - -显示内存使用情况 - -```bash -free -m - total used free shared buffers cached -Mem: 2016 1973 42 0 163 1497 --/+ buffers/cache: 312 1703 -Swap: 4094 0 4094 -``` - - **第一部分Mem行解释:** - -``` -total:内存总数; -used:已经使用的内存数; -free:空闲的内存数; -shared:当前已经废弃不用; -buffers Buffer:缓存内存数; -cached Page:缓存内存数。 -``` - -关系:total = used + free - - **第二部分(-/+ buffers/cache)解释:** - -``` -(-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached -(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached -``` - -可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。 - -第三部分是指交换分区。 - -输出结果的第四行是交换分区SWAP的,也就是我们通常所说的虚拟内存。 -区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. - -第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。 - -所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 -如本机情况的可用内存为: - -18007156=2098428KB+4545340KB+11363424KB - -接下来解释什么时候内存会被交换,以及按什么方交换。 - -当可用内存少于额定值的时候,就会开会进行交换。如何看额定值: - -```bash -cat /proc/meminfo - -MemTotal: 16140816 kB -MemFree: 816004 kB -MemAvailable: 2913824 kB -Buffers: 17912 kB -Cached: 2239076 kB -SwapCached: 0 kB -Active: 12774804 kB -Inactive: 1594328 kB -Active(anon): 12085544 kB -Inactive(anon): 94572 kB -Active(file): 689260 kB -Inactive(file): 1499756 kB -Unevictable: 116888 kB -Mlocked: 116888 kB -SwapTotal: 8191996 kB -SwapFree: 8191996 kB -Dirty: 56 kB -Writeback: 0 kB -AnonPages: 12229228 kB -Mapped: 117136 kB -Shmem: 58736 kB -Slab: 395568 kB -SReclaimable: 246700 kB -SUnreclaim: 148868 kB -KernelStack: 30496 kB -PageTables: 165104 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 16262404 kB -Committed_AS: 27698600 kB -VmallocTotal: 34359738367 kB -VmallocUsed: 311072 kB -VmallocChunk: 34350899200 kB -HardwareCorrupted: 0 kB -AnonHugePages: 3104768 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB -DirectMap4k: 225536 kB -DirectMap2M: 13279232 kB -DirectMap1G: 5242880 kB -``` - -交换将通过三个途径来减少系统中使用的物理页面的个数:  - -1. 减少缓冲与页面cache的大小, -2. 将系统V类型的内存页面交换出去,  -3. 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。 - -事实上,少量地使用swap是不是影响到系统性能的。 - -那buffers和cached都是缓存,两者有什么区别呢? - -为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式: - -Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 -磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。 - -Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。 - -Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。 - -简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。 - -所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准. - -如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。 - - - +free +=== + +显示内存的使用情况 + +## 补充说明 + +**free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 + +### 语法 + +``` +free(选项) +``` + +### 选项 + +```bash +-b # 以Byte为单位显示内存使用情况; +-k # 以KB为单位显示内存使用情况; +-m # 以MB为单位显示内存使用情况; +-g # 以GB为单位显示内存使用情况。 +-o # 不显示缓冲区调节列; +-s<间隔秒数> # 持续观察内存使用状况; +-t # 显示内存总和列; +-V # 显示版本信息。 +``` + +### 实例 + +```bash +free -t # 以总和的形式显示内存的使用信息 +free -s 10 # 周期性的查询内存使用信息,每10s 执行一次命令 +``` + +显示内存使用情况 + +```bash +free -m + total used free shared buffers cached +Mem: 2016 1973 42 0 163 1497 +-/+ buffers/cache: 312 1703 +Swap: 4094 0 4094 +``` + + **第一部分Mem行解释:** + +``` +total:内存总数; +used:已经使用的内存数; +free:空闲的内存数; +shared:当前已经废弃不用; +buffers Buffer:缓存内存数; +cached Page:缓存内存数。 +``` + +关系:total = used + free + + **第二部分(-/+ buffers/cache)解释:** + +``` +(-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached +(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached +``` + +可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。 + +第三部分是指交换分区。 + +输出结果的第四行是交换分区SWAP的,也就是我们通常所说的虚拟内存。 +区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. + +第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。 + +所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 +如本机情况的可用内存为: + +18007156=2098428KB+4545340KB+11363424KB + +接下来解释什么时候内存会被交换,以及按什么方交换。 + +当可用内存少于额定值的时候,就会开会进行交换。如何看额定值: + +```bash +cat /proc/meminfo + +MemTotal: 16140816 kB +MemFree: 816004 kB +MemAvailable: 2913824 kB +Buffers: 17912 kB +Cached: 2239076 kB +SwapCached: 0 kB +Active: 12774804 kB +Inactive: 1594328 kB +Active(anon): 12085544 kB +Inactive(anon): 94572 kB +Active(file): 689260 kB +Inactive(file): 1499756 kB +Unevictable: 116888 kB +Mlocked: 116888 kB +SwapTotal: 8191996 kB +SwapFree: 8191996 kB +Dirty: 56 kB +Writeback: 0 kB +AnonPages: 12229228 kB +Mapped: 117136 kB +Shmem: 58736 kB +Slab: 395568 kB +SReclaimable: 246700 kB +SUnreclaim: 148868 kB +KernelStack: 30496 kB +PageTables: 165104 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 16262404 kB +Committed_AS: 27698600 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 311072 kB +VmallocChunk: 34350899200 kB +HardwareCorrupted: 0 kB +AnonHugePages: 3104768 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 225536 kB +DirectMap2M: 13279232 kB +DirectMap1G: 5242880 kB +``` + +交换将通过三个途径来减少系统中使用的物理页面的个数:  + +1. 减少缓冲与页面cache的大小, +2. 将系统V类型的内存页面交换出去,  +3. 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。 + +事实上,少量地使用swap是不是影响到系统性能的。 + +那buffers和cached都是缓存,两者有什么区别呢? + +为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式: + +Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 +磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。 + +Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。 + +Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。 + +简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。 + +所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准. + +如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。 + + + diff --git a/LearnShell/LinuxCommands/fsck.ext4.md b/LearnShell/LinuxCommands/fsck.ext4.md new file mode 100755 index 0000000..e69de29 diff --git a/LearnShell/LinuxCommands/fsck.md b/LearnShell/LinuxCommands/fsck.md old mode 100644 new mode 100755 index c1ffe9a..e7d62b7 --- a/LearnShell/LinuxCommands/fsck.md +++ b/LearnShell/LinuxCommands/fsck.md @@ -1,6 +1,6 @@ fsck === - + 检查并且试图修复文件系统中的错误 ## 补充说明 diff --git a/LearnShell/LinuxCommands/git.md b/LearnShell/LinuxCommands/git.md old mode 100644 new mode 100755 diff --git a/LearnShell/LinuxCommands/grep.md b/LearnShell/LinuxCommands/grep.md old mode 100644 new mode 100755 index 1666747..3503ecd --- a/LearnShell/LinuxCommands/grep.md +++ b/LearnShell/LinuxCommands/grep.md @@ -1,256 +1,359 @@ -grep -=== - -强大的文本搜索工具 - -## 补充说明 - -**grep** (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。 - -### 选项 - -```bash --a --text # 不要忽略二进制数据。 --A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。 --b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。 --B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。 --c --count # 计算符合范本样式的列数。 --C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。 --d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。 --e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。 --E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。 --f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。 --F --fixed-regexp # 将范本样式视为固定字符串的列表。 --G --basic-regexp # 将范本样式视为普通的表示法来使用。 --h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。 --H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。 --i --ignore-case # 忽略字符大小写的差别。 --l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。 --L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。 --n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号(首行编号为1)。 --q --quiet或--silent # 不显示任何信息。 --R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。 --s --no-messages # 不显示错误信息。 --v --revert-match # 反转查找。 --V --version # 显示版本信息。 --w --word-regexp # 只显示全字符合的列。 --x --line-regexp # 只显示全列符合的列。 --y # 此参数效果跟“-i”相同。 --o # 只输出文件中匹配到的部分。 -``` - -### 规则表达式 - -```bash -^ # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 -$ # 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 -. # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 -* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 -.* # 一起用代表任意字符。 -[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 -[^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 -\(..\) # 标记匹配字符,如'\(love\)',love被标记为1。 -\< # 锚定单词的开始,如:'\ # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 -x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。 -x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。 -x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。 -\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 -\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。 -\b # 单词锁定符,如: '\bgrep\b'只匹配grep。 -``` - -## grep命令常见用法 - -在文件中搜索一个单词,命令会返回一个包含 **“match_pattern”** 的文本行: - -``` -grep match_pattern file_name -grep "match_pattern" file_name - -``` - -在多个文件中查找: - -``` -grep "match_pattern" file_1 file_2 file_3 ... - -``` - -输出除之外的所有行 **-v** 选项: - -``` -grep -v "match_pattern" file_name - -``` - -标记匹配颜色 **--color=auto** 选项: - -``` -grep "match_pattern" file_name --color=auto - -``` - -使用正则表达式 **-E** 选项: - -``` -grep -E "[1-9]+" -或 -egrep "[1-9]+" - -``` - -只输出文件中匹配到的部分 **-o** 选项: - -``` -echo this is a test line. | grep -o -E "[a-z]+\." -line. - -echo this is a test line. | egrep -o "[a-z]+\." -line. - -``` - -统计文件或者文本中包含匹配字符串的行数 **-c** 选项: - -``` -grep -c "text" file_name - -``` - -输出包含匹配字符串的行数 **-n** 选项: - -``` -grep "text" -n file_name -或 -cat file_name | grep "text" -n - -#多个文件 -grep "text" -n file_1 file_2 - -``` - -打印样式匹配所位于的字符或字节偏移: - -``` -echo gun is not unix | grep -b -o "not" -7:not - -#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。 - -``` - -搜索多个文件并查找匹配文本在哪些文件中: - -``` -grep -l "text" file1 file2 file3... - -``` - -### grep递归搜索文件 - -在多级目录中对文本进行递归搜索: - -``` -grep "text" . -r -n -# .表示当前目录。 - -``` - -忽略匹配样式中的字符大小写: - -``` -echo "hello world" | grep -i "HELLO" -hello - -``` - -选项 **-e** 制动多个匹配样式: - -``` -echo this is a text line | grep -e "is" -e "line" -o -is -line - -#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。 -cat patfile -aaa -bbb - -echo aaa bbb ccc ddd eee | grep -f patfile -o - -``` - -在grep搜索结果中包括或者排除指定文件: - -``` -#只在目录中所有的.php和.html文件中递归搜索字符"main()" -grep "main()" . -r --include *.{php,html} - -#在搜索结果中排除所有README文件 -grep "main()" . -r --exclude "README" - -#在搜索结果中排除filelist文件列表里的文件 -grep "main()" . -r --exclude-from filelist - -``` - -使用0值字节后缀的grep与xargs: - -```bash -# 测试文件: -echo "aaa" > file1 -echo "bbb" > file2 -echo "aaa" > file3 - -grep "aaa" file* -lZ | xargs -0 rm - -#执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。 - -``` - -grep静默输出: - -```bash -grep -q "test" filename -# 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。 -``` - -打印出匹配文本之前或者之后的行: - -```bash -# 显示匹配某个结果之后的3行,使用 -A 选项: -seq 10 | grep "5" -A 3 -5 -6 -7 -8 - -# 显示匹配某个结果之前的3行,使用 -B 选项: -seq 10 | grep "5" -B 3 -2 -3 -4 -5 - -# 显示匹配某个结果的前三行和后三行,使用 -C 选项: -seq 10 | grep "5" -C 3 -2 -3 -4 -5 -6 -7 -8 - -# 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符: -echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 -a -b --- -a -b -``` - - - +grep +=== + +强大的文本搜索工具 + +## 补充说明 + +**grep** (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。 + +grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。 + +grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。 +### 选项 + +```sh +用法: grep [选项]... PATTERN [FILE]... +在每个 FILE 或是标准输入中查找 PATTERN。 +默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。 +例如: grep -i 'hello world' menu.h main.c + +正则表达式选择与解释: + -E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE) + -F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串。 + -G, --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE) + -P, --perl-regexp PATTERN 是一个 Perl 正则表达式 + -e, --regexp=PATTERN 用 PATTERN 来进行匹配操作 + -f, --file=FILE 从 FILE 中取得 PATTERN + -i, --ignore-case 忽略大小写 + -w, --word-regexp 强制 PATTERN 仅完全匹配字词 + -x, --line-regexp 强制 PATTERN 仅完全匹配一行 + -z, --null-data 一个 0 字节的数据行,但不是空行 + +杂项: + -s, --no-messages 抑制错误消息 + -v, --invert-match 查看没有被匹配的行 + -V, --version display version information and exit + --help display this help text and exit + +输出控制: + -m, --max-count=NUM NUM 次匹配后停止 + -b, --byte-offset 输出的同时打印字节偏移 + -n, --line-number 输出匹配字符的同时打印行号 + --line-buffered 每行输出清空 + -H, --with-filename 为每一匹配项打印文件名 + -h, --no-filename 输出时不显示文件名前缀 + --label=LABEL 将LABEL 作为标准输入文件名前缀 + -o, --only-matching 仅打印匹配行的匹配(非空白)部分,每个这样的部分位于单独的输出行中。 + -q, --quiet, --silent suppress all normal output,不要向标准输出写任何东西 + --binary-files=TYPE assume that binary files are TYPE; + TYPE is 'binary', 'text', or 'without-match' + -a, --text equivalent to --binary-files=text + -I equivalent to --binary-files=without-match + -d, --directories=ACTION how to handle directories; + ACTION is 'read', 'recurse', or 'skip' + -D, --devices=ACTION how to handle devices, FIFOs and sockets; + ACTION is 'read' or 'skip' + 如果输入文件是设备,FIFO或套接字,则使用操作来处理它。默认情况下,操作是'读',这意味着设备的读取就像是普通文件一样。如果行动是'跳跃',设备,FIFO和套接字默默跳过。 + -r, --recursive like --directories=recurse 递归搜索,包括子目录下的文件 + -R, --dereference-recursive + likewise, but follow all symlinks + --include=FILE_PATTERN + search only files that match FILE_PATTERN + --exclude=FILE_PATTERN + skip files and directories matching FILE_PATTERN + --exclude-from=FILE skip files matching any file pattern from FILE + --exclude-dir=PATTERN directories that match PATTERN will be skipped. + -L, --files-without-match print only names of FILEs containing no match + -l, --files-with-matches 只打印包含匹配的文件的名称 + -c, --count 只打印每个文件匹配字符串行的数量 + -T, --initial-tab make tabs line up (if needed) + -Z, --null print 0 byte after FILE name + +文件控制: + -B, --before-context=NUM 打印以文本起始的NUM 行 + -A, --after-context=NUM 打印以文本结尾的NUM 行 + -C, --context=NUM 打印输出文本NUM 行 + -NUM same as --context=NUM + --group-separator=SEP use SEP as a group separator + --no-group-separator use empty string as a group separator + --color[=WHEN], + --colour[=WHEN] use markers to highlight the matching strings; + WHEN is 'always', 'never', or 'auto' + -U, --binary do not strip CR characters at EOL (MSDOS/Windows) + -u, --unix-byte-offsets report offsets as if CRs were not there + (MSDOS/Windows) + +‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。 +直接使用‘egrep’或是‘fgrep’均已不可行了。 +egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。 +若FILE 为 -,将读取标准输入。不带FILE,读取当前目录,除非命令行中指定了-r 选项。 +如果少于两个FILE 参数,就要默认使用-h 参数。 +如果有任意行被匹配,那退出状态为 0,否则为 1; +如果有错误产生,且未指定 -q 参数,那退出状态为 2。 + +``` + +### 规则表达式 + +```bash +^ # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 +$ # 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 +\ # 转义符 +. # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 +* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 +.* # 一起用代表任意字符。 +[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 +[^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 +\(..\) # 标记匹配字符,如'\(love\)',love被标记为1。 +\< # 锚定单词的开始,如:'\ # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 +x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。 +x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。 +x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。 +\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 +\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。 +\b # 单词锁定符,如: '\bgrep\b'只匹配grep。 +``` +## POSIX字符类 + +```sh +[:upper:] 表示大写字母[A-Z] + +[:lower:] 表示小写字母[a-z] + +[:digit:] 表示阿拉伯数字[0-9] + +[:alnum:] 表示大小写字母和阿拉伯数字[0-9a-zA-Z] + +[:space:] 表示空格或tab键 + +[:alpha:] 表示大小写字母[a-zA-Z] + +[:cntrl:] 表示Ctrl键 + +[:graph:]或[:print:] 表示ASCII码33-126之间的字符 + + +搜索以大写字母开头的行 + +grep ^[[:upper:]] test.txt + +POSIX字符类作为模式的用法都类似,使用时注意用方括号将POSIX字符括起来就行了 + +精确匹配单词the的行 + +grep "\" test.txt或grep -w the test.txt + +或|字符,grep需要加上-E选项才能支持使用它 +匹配test.txt文件有zh或en的行 + +grep -E "zh|en" test.txt + +grep:标准grep命令,支持基本正则表达式 + +egrep:扩展grep命令,支持基本和扩展正则表达式,与grep -E等价 + +fgrep:快速grep命令,不支持正则表达式,与grep -F等价 + +``` + +## grep命令常见用法 + +递归搜索含有某个关键字的文件目录 +grep -iHR "关键字" ./* +-i 对要搜索的字符忽略大小写 +-H 同时打印包括搜索字符串的文件名 +-R 递归搜索,当指定的搜索路径是一个目录时,加上-R的搜索会执行递归搜索 + +搜所文件test.txt以/字符开始,中间任意四个字符,第六个字符为/的行 + +grep ^/..../ test.txt + +在文件中搜索一个单词,命令会返回一个包含 **“match_pattern”** 的文本行: + +``` +grep match_pattern file_name +grep "match_pattern" file_name +``` + +在多个文件中查找: + +``` +grep "match_pattern" file_1 file_2 file_3 ... +``` + +输出除之外的所有行 **-v** 选项: + +``` +grep -v "match_pattern" file_name +``` + +标记匹配颜色 **--color=auto** 选项: + +``` +grep "match_pattern" file_name --color=auto + +``` + +使用正则表达式 **-E** 选项: + +``` +grep -E "[1-9]+" +或 +egrep "[1-9]+" + +``` + +只输出文件中匹配到的部分 **-o** 选项: + +``` +echo this is a test line. | grep -o -E "[a-z]+\." +line. + +echo this is a test line. | egrep -o "[a-z]+\." +line. + +``` + +统计文件或者文本中包含匹配字符串的行数 **-c** 选项: + +``` +grep -c "text" file_name + +``` + +输出包含匹配字符串的行数 **-n** 选项: + +``` +grep "text" -n file_name +或 +cat file_name | grep "text" -n + +#多个文件 +grep "text" -n file_1 file_2 + +``` + +打印样式匹配所位于的字符或字节偏移: + +``` +echo gun is not unix | grep -b -o "not" +7:not + +#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。 + +``` + +搜索多个文件并查找匹配文本在哪些文件中: + +``` +grep -l "text" file1 file2 file3... + +``` + +### grep递归搜索文件 + +在多级目录中对文本进行递归搜索: + +``` +grep "text" . -r -n +# .表示当前目录。 + +``` + +忽略匹配样式中的字符大小写: + +``` +echo "hello world" | grep -i "HELLO" +hello + +``` + +选项 **-e** 制动多个匹配样式: + +``` +echo this is a text line | grep -e "is" -e "line" -o +is +line + +#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。 +cat patfile +aaa +bbb + +echo aaa bbb ccc ddd eee | grep -f patfile -o + +``` + +在grep搜索结果中包括或者排除指定文件: + +``` +#只在目录中所有的.php和.html文件中递归搜索字符"main()" +grep "main()" . -r --include *.{php,html} + +#在搜索结果中排除所有README文件 +grep "main()" . -r --exclude "README" + +#在搜索结果中排除filelist文件列表里的文件 +grep "main()" . -r --exclude-from filelist + +``` + +使用0值字节后缀的grep与xargs: + +```bash +# 测试文件: +echo "aaa" > file1 +echo "bbb" > file2 +echo "aaa" > file3 + +grep "aaa" file* -lZ | xargs -0 rm + +#执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。 + +``` + +grep静默输出: + +```bash +grep -q "test" filename +# 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。 +``` + +打印出匹配文本之前或者之后的行: + +```bash +# 显示匹配某个结果之后的3行,使用 -A 选项: +seq 10 | grep "example" -A 3 +或 +grep -A 3 -i "example" demo_text + +# 显示匹配某个结果之前的3行,使用 -B 选项: +seq 10 | grep "5" -B 3 +2 +3 +4 +5 + +# 显示匹配某个结果的前三行和后三行,使用 -C 选项: +seq 10 | grep "5" -C 3 +2 +3 +4 +5 +6 +7 +8 + +# 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符: +echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 +a +b +-- +a +b +``` + + + diff --git a/LearnShell/LinuxCommands/groupadd.md b/LearnShell/LinuxCommands/groupadd.md old mode 100644 new mode 100755 index a120fb0..03065a9 --- a/LearnShell/LinuxCommands/groupadd.md +++ b/LearnShell/LinuxCommands/groupadd.md @@ -1,6 +1,6 @@ groupadd === - + 用于创建一个新的工作组 ## 补充说明 @@ -16,10 +16,15 @@ groupadd(选项)(参数) ### 选项 ``` --g:指定新建工作组的id; --r:创建系统工作组,系统工作组的组ID小于500; --K:覆盖配置文件“/ect/login.defs”; --o:允许添加组ID号不唯一的工作组。 +-f, --force 如果组已经存在则成功退出 +并且如果 GID 已经存在则取消 -g +-g, --gid GID 为新组使用 GID +-h, --help 显示此帮助信息并推出 +-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值 +-o, --non-unique 允许创建有重复 GID 的组 +-p, --password PASSWORD 为新组使用此加密过的密码 +-r, --system 创建一个系统账户 +-R, --root CHROOT_DIR chroot 到的目录 ``` ### 参数 @@ -37,4 +42,4 @@ groupadd -g 344 jsdigname 此时在`/etc/passwd`文件中产生一个组ID(GID)是344的项目。 - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/groupdel.md b/LearnShell/LinuxCommands/groupdel.md old mode 100644 new mode 100755 index 817c141..f4af465 --- a/LearnShell/LinuxCommands/groupdel.md +++ b/LearnShell/LinuxCommands/groupdel.md @@ -1,6 +1,6 @@ groupdel === - + 用于删除指定的工作组 ## 补充说明 @@ -24,5 +24,3 @@ groupadd damon //创建damon工作组 groupdel damon //删除这个工作组 ``` - - \ No newline at end of file diff --git a/LearnShell/LinuxCommands/groupmod.md b/LearnShell/LinuxCommands/groupmod.md old mode 100644 new mode 100755 index a2eb701..b3ff2a7 --- a/LearnShell/LinuxCommands/groupmod.md +++ b/LearnShell/LinuxCommands/groupmod.md @@ -1,6 +1,6 @@ groupmod === - + 更改群组识别码或名称 ## 补充说明 @@ -16,9 +16,12 @@ groupmod(选项)(参数) ### 选项 ``` --g<群组识别码>:设置欲使用的群组识别码; --o:重复使用群组识别码; --n<新群组名称>:设置欲使用的群组名称。 +-g, --gid GID 将组 ID 改为 GID +-h, --help 显示此帮助信息并推出 +-n, --new-name NEW_GROUP 改名为 NEW_GROUP +-o, --non-unique 允许使用重复的 GID +-p, --password PASSWORD 将密码更改为(加密过的) PASSWORD +-R, --root CHROOT_DIR chroot 到的目录 ``` ### 参数 @@ -26,4 +29,4 @@ groupmod(选项)(参数) 组名:指定要修改的工作的组名。 - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/gunzip.md b/LearnShell/LinuxCommands/gunzip.md old mode 100644 new mode 100755 index 5eb9c97..0e9a5d7 --- a/LearnShell/LinuxCommands/gunzip.md +++ b/LearnShell/LinuxCommands/gunzip.md @@ -1,67 +1 @@ -gunzip -=== - -用来解压缩文件 - -## 补充说明 - -**gunzip命令** 用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。 - -### 语法 - -``` -gunzip(选项)(参数) -``` - -### 选项 - -``` --a或——ascii:使用ASCII文字模式; --c或--stdout或--to-stdout:把解压后的文件输出到标准输出设备; --f或-force:强行解开压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接; --h或——help:在线帮助; --l或——list:列出压缩文件的相关信息; --L或——license:显示版本与版权信息; --n或--no-name:解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其忽略不予处理; --N或——name:解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其回存到解开的文件上; --q或——quiet:不显示警告信息; --r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理; --S或<压缩字尾字符串>或----suffix<压缩字尾字符串>:更改压缩字尾字符串; --t或——test:测试压缩文件是否正确无误; --v或——verbose:显示指令执行过程; --V或——version:显示版本信息; -``` - -### 参数 - -文件列表:指定要解压缩的压缩包。 - -### 实例 - -首先将`/etc`目录下的所有文件以及子目录进行压缩,备份压缩包etc.zip到`/opt`目录,然后对etc.zip文件进行gzip压缩,设置gzip的压缩级别为9。 - -``` -zip –r /opt/etc.zip /etc -gzip -9v /opt/etc.zip -``` - -查看上述etc.zip.gz文件的压缩信息。 - -``` -gzip -l /opt/etc.zip.gz -compressed uncompressed ratio uncompressed_name -11938745 12767265 6.5% /opt/etc.zip -``` - -解压上述etc.zip.gz文件到当前目录。 - -``` -[root@mylinux ~]#gzip –d /opt/etc.zip.gz -或者执行 -[root@mylinux ~]#gunzip /opt/etc.zip.gz -``` - -通过上面的示例可以知道`gzip –d`等价于`gunzip`命令。 - - - \ No newline at end of file + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/gzip.md b/LearnShell/LinuxCommands/gzip.md old mode 100644 new mode 100755 index f725cc3..e067714 --- a/LearnShell/LinuxCommands/gzip.md +++ b/LearnShell/LinuxCommands/gzip.md @@ -1,86 +1 @@ -gzip -=== - -用来压缩文件 - -## 补充说明 - -**gzip命令** 用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处“.gz”扩展名。 - -gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式。据统计,gzip命令对文本文件有60%~70%的压缩率。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。 - -### 语法 - -``` -gzip(选项)(参数) -``` - -### 选项 - -``` --a或——ascii:使用ASCII文字模式; --d或--decompress或----uncompress:解开压缩文件; --f或——force:强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接; --h或——help:在线帮助; --l或——list:列出压缩文件的相关信息; --L或——license:显示版本与版权信息; --n或--no-name:压缩文件时,不保存原来的文件名称及时间戳记; --N或——name:压缩文件时,保存原来的文件名称及时间戳记; --q或——quiet:不显示警告信息; --r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理; --S或<压缩字尾字符串>或----suffix<压缩字尾字符串>:更改压缩字尾字符串; --t或——test:测试压缩文件是否正确无误; --v或——verbose:显示指令执行过程; --V或——version:显示版本信息; --<压缩效率>:压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高; ---best:此参数的效果和指定“-9”参数相同; ---fast:此参数的效果和指定“-1”参数相同。 --num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6。 -``` - -### 参数 - -文件列表:指定要压缩的文件列表。 - -### 实例 - -把test6目录下的每个文件压缩成.gz文件 - -``` -gzip * -``` - -把上例中每个压缩的文件解压,并列出详细的信息 - -``` -gzip -dv * -``` - -详细显示例1中每个压缩的文件的信息,并不解压 - -``` -gzip -l * -``` - -压缩一个tar备份文件,此时压缩文件的扩展名为.tar.gz - -``` -gzip -r log.tar -``` - -递归的压缩目录 - -``` -gzip -rv test6 -``` - -这样,所有test下面的文件都变成了*.gz,目录依然存在只是目录里面的文件相应变成了*.gz.这就是压缩,和打包不同。因为是对目录操作,所以需要加上-r选项,这样也可以对子目录进行递归了。 - -递归地解压目录 - -``` -gzip -dr test6 -``` - - - + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/halt.md b/LearnShell/LinuxCommands/halt.md old mode 100644 new mode 100755 index 1e03bf9..9b8ebe0 --- a/LearnShell/LinuxCommands/halt.md +++ b/LearnShell/LinuxCommands/halt.md @@ -1,35 +1 @@ -halt -=== - -关闭正在运行的Linux操作系统 - -## 补充说明 - -**halt命令** 用来关闭正在运行的Linux操作系统。halt命令会先检测系统的runlevel,若runlevel为0或6,则关闭系统,否则即调用shutdown来关闭系统。 - -### 语法 - -``` -halt(选项) -``` - -### 选项 - -``` --d:不要在wtmp中记录; --f:不论目前的runlevel为何,不调用shutdown即强制关闭系统; --i:在halt之前,关闭全部的网络界面; --n:halt前,不用先执行sync; --p:halt之后,执行poweroff; --w:仅在wtmp中记录,而不实际结束系统。 -``` - -### 实例 - -``` -halt -p //关闭系统后关闭电源。 -halt -d //关闭系统,但不留下纪录。 -``` - - - \ No newline at end of file + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/head.md b/LearnShell/LinuxCommands/head.md old mode 100644 new mode 100755 index c71e1b7..8c25472 --- a/LearnShell/LinuxCommands/head.md +++ b/LearnShell/LinuxCommands/head.md @@ -1,30 +1 @@ -head -=== - -在屏幕上显示指定文件的开头若干行 - -## 补充说明 - -**head命令** 用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。 - -### 语法 - -``` -head(选项)(参数) -``` - -### 选项 - -``` --n<数字>:指定显示头部内容的行数; --c<字符数>:指定显示头部内容的字符数; --v:总是显示文件名的头信息; --q:不显示文件名的头信息。 -``` - -### 参数 - -文件列表:指定显示头部内容的文件列表。 - - - \ No newline at end of file + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/history.md b/LearnShell/LinuxCommands/history.md old mode 100644 new mode 100755 index 6d966bd..13dce28 --- a/LearnShell/LinuxCommands/history.md +++ b/LearnShell/LinuxCommands/history.md @@ -1,66 +1 @@ -history -=== - -用于显示历史命令 - -## 补充说明 - -**history命令** 用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。 - -该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号`!`执行指定序号的历史命令。例如,要执行第2个历史命令,则输入`!2`。 - -历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量`HISTSIZE`进行控制。 - -### 语法 - -``` -history(选项)(参数) -``` - -### 选项 - -``` --c:清空当前历史命令; --a:将历史命令缓冲区中命令写入历史命令文件中; --r:将历史命令文件中的命令读入当前历史命令缓冲区; --w:将当前历史命令缓冲区命令写入历史命令文件中。 -``` - -### 参数 - -n:打印最近的n条历史命令。 - -### 实例 - -使用history命令显示最近使用的10条历史命令,输入如下命令: - -``` -[root@localhost ~]# history 10 - 92 ls - 93 cd .. - 94 ls - 95 exit - 96 ls -a - 97 cd .ssh/ - 98 ls - 99 cat known_hosts - 100 exit - 101 history 10 -``` - -列出最近3条记录 - -``` -[root@localhost ~]# history 3 - 15 2017-08-26 11:44:35 root history 3 - 16 2017-08-26 11:44:37 root history n - 17 2017-08-26 11:44:40 root history 3 -``` - -清空历史记录 - -``` -[root@localhost ~]# history -c -``` - - + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/htop.md b/LearnShell/LinuxCommands/htop.md old mode 100644 new mode 100755 index f801320..addbce6 --- a/LearnShell/LinuxCommands/htop.md +++ b/LearnShell/LinuxCommands/htop.md @@ -1,129 +1 @@ -htop -=== - -[非内部命令]一个互动的进程查看器,可以动态观察系统进程状况。 - -## 补充说明 - -htop命令 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。 - -与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。 - -与top相比,htop有以下优点: - -- 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。 -- 在启动上,比top 更快。 -- 杀进程时不需要输入进程号。 -- htop 支持鼠标操作。 -- 两者相比起来,top比较繁琐。 - -top缺点: - -- 只支持键盘操作。 -- 显示也单调。 - -htop 官网:http://htop.sourceforge.net/ - -### 语法 - -``` -htop -``` - -### 参数 - -``` --C --no-color 使用单色配色方案 --d --delay=DELAY 设置更新之间的延迟,在十秒 --s --sort-key=COLUMN 纵列排序(try --sort-key=help for a list) --u --user=USERNAME 只显示一个指定用户的进程 --p --pid=PID,[,PID,PID...] 只显示给用户 --h --help 打印此命令帮助 --v --version 打印版本信息 -``` - -### 选项 - -``` -h,? F1:查看htop使用说明 -S F2:设置 -/ F3:搜索进程 -\ F4:过滤器,按关键字搜索 -t F5:显示树形结构 -<,> F6:选择排序方式 -[ F7:减少nice值,这样就可以提高对应进程的优先级 -] F8:增加nice值,这样可以降低对应进程的优先级 -k F9:杀掉选中的进程 -q F10:退出htop - - -/ : 搜索字符 -h : 显示帮助 -l : 显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件 -u : 显示所有用户,并可以选择某一特定用户的进程 -U : 取消标记所有的进程 -s : 将调用strace追踪进程的系统调用 -t : 显示树形结构 - -H:显示/隐藏用户线程 -I:倒转排序顺序 -K:显示/隐藏内核线程 -M:按内存占用排序 -P:按CPU排序 -T:按运行时间排序 - -上下键或PgUP, PgDn : 移动选中进程 -左右键或Home, End : 移动列表 -Space(空格) : 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程 - -``` - - -### Htop设定 - -鼠标点击Setup或者按下F2 之后进入htop 设定的页面 - -#### 1. Meters - -设定顶端的 显示信息,分为左右两侧,Left column 表示左侧的显示的信息,Right column表示右侧显示的信息,如果要新加选项,可以选择Available meters添加,F5新增到上方左侧,F6新增到上方右侧。Left column和Right column下面的选项,可以选定信息的显示方式,有LED、Bar(进度条)、Text(文本模式),可以根据个人喜好进行设置 - -#### 2. Display options - -选择要显示的内容,按空格 x表示显示,选择完后,按F10保存 - -#### 3. Colors - -设定界面以什么颜色来显示,个人认为用处不大,各人喜好不同 - -#### 4. Colums - -作用是增加或取消要显示的各项内容,选择后F7(向上移动)、F8(向下移动)、F9(取消显示、F10(保存更改))此处增加了PPID、PGRP,根据各人需求,显示那些信息。 - -**F3 搜索进程** - -在界面下按F3或直接输入”/”就可以直接进入搜索模式,是按照进程名进行搜索的,搜索到的进程会用设定的颜色标记出来,方便查看。 - -**F4:过滤器** - -相当于模糊查找,不区分大小写,下方输入要搜索的内容后,则界面只显示搜索到的内容,更加方便查看 - -**F5:以树形方式显示** - - -**F6:排序方式** - -按下F6后会跳转至以树形方式显示界面,让您选择以什么方式进行排序,在Sort by下选择您要以什么来排序 - -**F7,F8:调整进程nice值** - -F7表示减小nice值(增大优先级),F8增大nice值(减小优先级),选择某一进程,按F7或F8来增大或减小nice值,nice值范围为-20-19 - - -**F9:杀死进程** - -选择某一进程按F9即可杀死此进程,很方便 - -**F10:退出htop** - - - \ No newline at end of file + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/hwclock.md b/LearnShell/LinuxCommands/hwclock.md old mode 100644 new mode 100755 index 08f2209..fa5c41b --- a/LearnShell/LinuxCommands/hwclock.md +++ b/LearnShell/LinuxCommands/hwclock.md @@ -22,7 +22,7 @@ hwclock(选项) --debug:显示hwclock执行时详细的信息; --directisa:hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟; --hctosys:将系统时钟调整为与目前的硬件时钟一致; ---set --date=<日期与时间>:设定硬件时钟; +--set --date=<日期与时间>:设定硬件时钟;hwclock --set --date='28/3/2018 12:34:00' --show:显示硬件时钟的时间与日期; --systohc:将硬件时钟调整为与目前的系统时钟一致; --test:仅测试程序,而不会实际更改硬件时钟; diff --git a/LearnShell/LinuxCommands/info.md b/LearnShell/LinuxCommands/info.md old mode 100644 new mode 100755 index be85092..21bd5d7 --- a/LearnShell/LinuxCommands/info.md +++ b/LearnShell/LinuxCommands/info.md @@ -1,6 +1,6 @@ info === - + Linux下info格式的帮助指令 ## 补充说明 diff --git a/LearnShell/LinuxCommands/inotifywait.md b/LearnShell/LinuxCommands/inotifywait.md old mode 100644 new mode 100755 index 12da42d..8641fc0 --- a/LearnShell/LinuxCommands/inotifywait.md +++ b/LearnShell/LinuxCommands/inotifywait.md @@ -1,6 +1,6 @@ inotifywait === - + 异步文件系统监控机制 ## 补充说明 diff --git a/LearnShell/LinuxCommands/iostat.md b/LearnShell/LinuxCommands/iostat.md old mode 100644 new mode 100755 index fd6b552..7353242 --- a/LearnShell/LinuxCommands/iostat.md +++ b/LearnShell/LinuxCommands/iostat.md @@ -1,6 +1,6 @@ iostat === - + 监视系统输入输出设备和CPU的使用情况 ## 补充说明 @@ -49,6 +49,13 @@ Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda1 0.02 0.08 0.00 2014 4 + +持续查看io使用情况 +说明: +%util接近100%说明I/O请求过多,磁盘可能存在瓶颈 +idble小于70%,I/O负荷过大,进程读取有过多的等待,用vmstat查看b参数(等待资源的进程数)和wa参数(I/O等待所占用的CPU时间百分比,高于30%说明I/O压力较高) +iostat -d -x -k 1 + ``` 详细说明:第二行是系统信息和监测时间,第三行和第四行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示: @@ -182,4 +189,4 @@ sda1 0.02 0.08 - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/iotop.md b/LearnShell/LinuxCommands/iotop.md old mode 100644 new mode 100755 index b1e3802..0ad7de3 --- a/LearnShell/LinuxCommands/iotop.md +++ b/LearnShell/LinuxCommands/iotop.md @@ -1,6 +1,6 @@ iotop === - + 用来监视磁盘I/O使用状况的工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ip.md b/LearnShell/LinuxCommands/ip.md old mode 100644 new mode 100755 index db4168d..740a9a3 --- a/LearnShell/LinuxCommands/ip.md +++ b/LearnShell/LinuxCommands/ip.md @@ -1,136 +1,106 @@ -ip -=== - -网络配置工具 - -## 补充说明 - -**ip命令** 用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道,是Linux下较新的功能强大的网络配置工具。 - -### 语法 - -``` -ip(选项)(参数) -Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } - ip [ -force ] -batch filename -``` - -### 选项 - -``` -OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | - tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | - netns | l2tp | macsec | tcp_metrics | token } - --V:显示指令版本信息; --s:输出更详细的信息; --f:强制使用指定的协议族; --4:指定使用的网络层协议是IPv4协议; --6:指定使用的网络层协议是IPv6协议; --0:输出信息每条记录输出一行,即使内容较多也不换行显示; --r:显示主机时,不使用IP地址,而使用主机的域名。 -``` - -### 参数 - -``` -OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | - -h[uman-readable] | -iec | - -f[amily] { inet | inet6 | ipx | dnet | bridge | link } | - -4 | -6 | -I | -D | -B | -0 | - -l[oops] { maximum-addr-flush-attempts } | - -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] | - -rc[vbuf] [size] | -n[etns] name | -a[ll] } - -网络对象:指定要管理的网络对象; -具体操作:对指定的网络对象完成具体操作; -help:显示网络对象支持的操作命令的帮助信息。 -``` - -### 实例 - -```bash -ip link show # 显示网络接口信息 -ip link set eth0 upi # 开启网卡 -ip link set eth0 down # 关闭网卡 -ip link set eth0 promisc on # 开启网卡的混合模式 -ip link set eth0 promisc offi # 关闭网卡的混个模式 -ip link set eth0 txqueuelen 1200 # 设置网卡队列长度 -ip link set eth0 mtu 1400 # 设置网卡最大传输单元 -ip addr show # 显示网卡IP信息 -ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1 -ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址 - -ip route show # 显示系统路由 -ip route add default via 192.168.1.254 # 设置系统默认路由 -ip route list # 查看路由信息 -ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口 -ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254 -ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关 -ip route del default # 删除默认路由 -ip route delete 192.168.1.0/24 dev eth0 # 删除路由 -``` - -**用ip命令显示网络设备的运行状态** - -``` -[root@localhost ~]# ip link list -1: lo: mtu 16436 qdisc noqueue - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 -2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 - link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff -3: eth1: mtu 1500 qdisc pfifo_fast qlen 1000 - link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff -``` - -**显示更加详细的设备信息** - -``` -[root@localhost ~]# ip -s link list -1: lo: mtu 16436 qdisc noqueue - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 - RX: bytes packets errors dropped overrun mcast - 5082831 56145 0 0 0 0 - TX: bytes packets errors dropped carrier collsns - 5082831 56145 0 0 0 0 -2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 - link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff - RX: bytes packets errors dropped overrun mcast - 3641655380 62027099 0 0 0 0 - TX: bytes packets errors dropped carrier collsns - 6155236 89160 0 0 0 0 -3: eth1: mtu 1500 qdisc pfifo_fast qlen 1000 - link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff - RX: bytes packets errors dropped overrun mcast - 2562136822 488237847 0 0 0 0 - TX: bytes packets errors dropped carrier collsns - 3486617396 9691081 0 0 0 0 -``` - -**显示核心路由表** - -``` -[root@localhost ~]# ip route list -112.124.12.0/22 dev eth1 proto kernel scope link src 112.124.15.130 -10.160.0.0/20 dev eth0 proto kernel scope link src 10.160.7.81 -192.168.0.0/16 via 10.160.15.247 dev eth0 -172.16.0.0/12 via 10.160.15.247 dev eth0 -10.0.0.0/8 via 10.160.15.247 dev eth0 -default via 112.124.15.247 dev eth1 -``` - -**显示邻居表** - -``` -[root@localhost ~]# ip neigh list -112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE -10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE -``` - -**获取主机所有网络接口** - -``` -ip link | grep ^[0-9] | awk -F: '{print $2}' -``` - - +ip +=== + +网络配置工具 + +## 补充说明 + +**ip命令** 用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道,是Linux下较新的功能强大的网络配置工具。 + +### 语法 + +``` +ip(选项)(参数) +``` + +### 选项 + +``` +-V:显示指令版本信息; +-s:输出更详细的信息; +-f:强制使用指定的协议族; +-4:指定使用的网络层协议是IPv4协议; +-6:指定使用的网络层协议是IPv6协议; +-0:输出信息每条记录输出一行,即使内容较多也不换行显示; +-r:显示主机时,不使用IP地址,而使用主机的域名。 +``` + +### 参数 + +``` +网络对象:指定要管理的网络对象; +具体操作:对指定的网络对象完成具体操作; +help:显示网络对象支持的操作命令的帮助信息。 +``` + +### 实例 + +```bash +ip route show # 显示系统路由 +ip route add default via 192.168.1.254 # 设置系统默认路由 +ip route delete 192.168.1.0/24 dev eth0 # 删除路由 +``` + +**用ip命令显示网络设备的运行状态** + +``` +[root@localhost ~]# ip link list +1: lo: mtu 16436 qdisc noqueue + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 + link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff +3: eth1: mtu 1500 qdisc pfifo_fast qlen 1000 + link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff +``` + +**显示更加详细的设备信息** + +``` +[root@localhost ~]# ip -s link list +1: lo: mtu 16436 qdisc noqueue + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + RX: bytes packets errors dropped overrun mcast + 5082831 56145 0 0 0 0 + TX: bytes packets errors dropped carrier collsns + 5082831 56145 0 0 0 0 +2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 + link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff + RX: bytes packets errors dropped overrun mcast + 3641655380 62027099 0 0 0 0 + TX: bytes packets errors dropped carrier collsns + 6155236 89160 0 0 0 0 +3: eth1: mtu 1500 qdisc pfifo_fast qlen 1000 + link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff + RX: bytes packets errors dropped overrun mcast + 2562136822 488237847 0 0 0 0 + TX: bytes packets errors dropped carrier collsns + 3486617396 9691081 0 0 0 0 +``` + +**显示核心路由表** + +``` +[root@localhost ~]# ip route list +112.124.12.0/22 dev eth1 proto kernel scope link src 112.124.15.130 +10.160.0.0/20 dev eth0 proto kernel scope link src 10.160.7.81 +192.168.0.0/16 via 10.160.15.247 dev eth0 +172.16.0.0/12 via 10.160.15.247 dev eth0 +10.0.0.0/8 via 10.160.15.247 dev eth0 +default via 112.124.15.247 dev eth1 +``` + +**显示邻居表** + +``` +[root@localhost ~]# ip neigh list +112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE +10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE +``` + +**获取主机所有网络接口** + +``` +ip link | grep ^[0-9] | awk -F: '{print $2}' +``` + + diff --git a/LearnShell/LinuxCommands/ip6tables-restore.md b/LearnShell/LinuxCommands/ip6tables-restore.md old mode 100644 new mode 100755 index a6638ee..29cefd1 --- a/LearnShell/LinuxCommands/ip6tables-restore.md +++ b/LearnShell/LinuxCommands/ip6tables-restore.md @@ -1,6 +1,6 @@ ip6tables-restore === - + 还原ip6tables表 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ip6tables-save.md b/LearnShell/LinuxCommands/ip6tables-save.md old mode 100644 new mode 100755 index 3513d74..fdea83a --- a/LearnShell/LinuxCommands/ip6tables-save.md +++ b/LearnShell/LinuxCommands/ip6tables-save.md @@ -1,6 +1,6 @@ ip6tables-save === - + 保存ip6tables表配置 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ip6tables.md b/LearnShell/LinuxCommands/ip6tables.md old mode 100644 new mode 100755 index ce10378..9ae53d6 --- a/LearnShell/LinuxCommands/ip6tables.md +++ b/LearnShell/LinuxCommands/ip6tables.md @@ -1,6 +1,6 @@ ip6tables === - + linux中防火墙软件 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ipcalc.md b/LearnShell/LinuxCommands/ipcalc.md old mode 100644 new mode 100755 index 9f39096..5f3517c --- a/LearnShell/LinuxCommands/ipcalc.md +++ b/LearnShell/LinuxCommands/ipcalc.md @@ -1,6 +1,6 @@ ipcalc === - + 简单的IP地址计算器 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ipcrm.md b/LearnShell/LinuxCommands/ipcrm.md old mode 100644 new mode 100755 index 71cc26f..53b57cc --- a/LearnShell/LinuxCommands/ipcrm.md +++ b/LearnShell/LinuxCommands/ipcrm.md @@ -1,6 +1,6 @@ ipcrm === - + 删除消息队列、信号集、或者共享内存标识 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ipcs.md b/LearnShell/LinuxCommands/ipcs.md old mode 100644 new mode 100755 index b8aa300..011450b --- a/LearnShell/LinuxCommands/ipcs.md +++ b/LearnShell/LinuxCommands/ipcs.md @@ -1,6 +1,6 @@ ipcs === - + 分析消息队列共享内存和信号量 ## 补充说明 diff --git a/LearnShell/LinuxCommands/iperf.md b/LearnShell/LinuxCommands/iperf.md old mode 100644 new mode 100755 index 56c090c..daa5c2c --- a/LearnShell/LinuxCommands/iperf.md +++ b/LearnShell/LinuxCommands/iperf.md @@ -1,6 +1,6 @@ iperf === - + 网络性能测试工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/iptables-restore.md b/LearnShell/LinuxCommands/iptables-restore.md old mode 100644 new mode 100755 index 50fe6bb..98caf12 --- a/LearnShell/LinuxCommands/iptables-restore.md +++ b/LearnShell/LinuxCommands/iptables-restore.md @@ -1,6 +1,6 @@ iptables-restore === - + 还原iptables表的配置 ## 补充说明 diff --git a/LearnShell/LinuxCommands/iptables-save.md b/LearnShell/LinuxCommands/iptables-save.md old mode 100644 new mode 100755 index 74742b7..6b68032 --- a/LearnShell/LinuxCommands/iptables-save.md +++ b/LearnShell/LinuxCommands/iptables-save.md @@ -1,6 +1,6 @@ iptables-save === - + 备份iptables的表配置 ## 补充说明 diff --git a/LearnShell/LinuxCommands/iptables.md b/LearnShell/LinuxCommands/iptables.md old mode 100644 new mode 100755 index 89359a2..9d75fec --- a/LearnShell/LinuxCommands/iptables.md +++ b/LearnShell/LinuxCommands/iptables.md @@ -12,19 +12,11 @@ Linux上常用的防火墙软件 - [补充说明](#补充说明) - [语法](#语法) - [选项](#选项) -- [基本参数](#基本参数) - [命令选项输入顺序](#命令选项输入顺序) - [工作机制](#工作机制) - [防火墙的策略](#防火墙的策略) - [防火墙的策略](#防火墙的策略-1) - [实例](#实例) - - [空当前的所有规则和计数](#空当前的所有规则和计数) - - [配置允许ssh端口连接](#配置允许ssh端口连接) - - [允许本地回环地址可以正常使用](#允许本地回环地址可以正常使用) - - [设置默认的规则](#设置默认的规则) - - [配置白名单](#配置白名单) - - [开启相应的服务端口](#开启相应的服务端口) - - [保存规则到配置文件中](#保存规则到配置文件中) - [列出已设置的规则](#列出已设置的规则) - [清除已有规则](#清除已有规则) - [删除已添加的规则](#删除已添加的规则) @@ -38,6 +30,75 @@ Linux上常用的防火墙软件 - [阻止Windows蠕虫的攻击](#阻止windows蠕虫的攻击) - [防止SYN洪水攻击](#防止syn洪水攻击) +Usage: iptables -[ACD] chain rule-specification [options] + iptables -I chain [rulenum] rule-specification [options] + iptables -R chain rulenum rule-specification [options] + iptables -D chain rulenum [options] + iptables -[LS] [chain [rulenum]] [options] + iptables -[FZ] [chain] [options] + iptables -[NX] chain + iptables -E old-chain-name new-chain-name + iptables -P chain target [options] + iptables -h (print this help information) + +Commands: +Either long or short options are allowed. + --append -A chain Append to chain + --check -C chain Check for the existence of a rule + --delete -D chain Delete matching rule from chain + --delete -D chain rulenum + Delete rule rulenum (1 = first) from chain + --insert -I chain [rulenum] + Insert in chain as rulenum (default 1=first) + --replace -R chain rulenum + Replace rule rulenum (1 = first) in chain + --list -L [chain [rulenum]] + List the rules in a chain or all chains + --list-rules -S [chain [rulenum]] + Print the rules in a chain or all chains + --flush -F [chain] Delete all rules in chain or all chains + --zero -Z [chain [rulenum]] + Zero counters in chain or all chains + --new -N chain Create a new user-defined chain + --delete-chain + -X [chain] Delete a user-defined chain + --policy -P chain target + Change policy on chain to target + --rename-chain + -E old-chain new-chain + Change chain name, (moving any references) +Options: + --ipv4 -4 Nothing (line is ignored by ip6tables-restore) + --ipv6 -6 Error (line is ignored by iptables-restore) +[!] --protocol -p proto protocol: by number or name, eg. `tcp' +[!] --source -s address[/mask][...] + source specification +[!] --destination -d address[/mask][...] + destination specification +[!] --in-interface -i input name[+] + network interface name ([+] for wildcard) + --jump -j target + target for rule (may load target extension) + --goto -g chain + jump to chain with no return + --match -m match + extended match (may load extension) + --numeric -n numeric output of addresses and ports +[!] --out-interface -o output name[+] + network interface name ([+] for wildcard) + --table -t table table to manipulate (default: `filter') + --verbose -v verbose mode + --wait -w [seconds] maximum wait to acquire xtables lock before give up + --wait-interval -W [usecs] wait time to try to acquire xtables lock + default is 1 second + --line-numbers print line numbers when listing + --exact -x expand numbers (display exact values) +[!] --fragment -f match second or further fragments only + --modprobe= try to insert modules using this command + --set-counters PKTS BYTES set the counter during insert/append +[!] --version -V print package version. + + ### 语法 @@ -79,24 +140,6 @@ iptables(选项)(参数) -h:显示帮助信息; ``` -## 基本参数 - -| 参数 | 作用 | -| ---- | ---- | -| -P | 设置默认策略:iptables -P INPUT (DROP|ACCEPT) | -| -F | 清空规则链 | -| -L | 查看规则链 | -| -A | 在规则链的末尾加入新规则 | -| -I | num 在规则链的头部加入新规则 | -| -D | num 删除某一条规则 | -| -s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 | -| -d | 匹配目标地址 | -| -i | 网卡名称 匹配从这块网卡流入的数据 | -| -o | 网卡名称 匹配从这块网卡流出的数据 | -| -p | 匹配协议,如tcp,udp,icmp | -| --dport num | 匹配目标端口号 | -| --sport num | 匹配来源端口号 | - #### 命令选项输入顺序 ``` @@ -117,14 +160,16 @@ iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协 防火墙策略一般分为两种,一种叫`通`策略,一种叫`堵`策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,`所以通,是要全通,而堵,则是要选择`。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。 -我们现在用的比较多个功能有3个: +防火墙规则表: -1. filter 定义允许或者不允许的,只能做在3个链上:INPUT ,FORWARD ,OUTPUT -2. nat 定义地址转换的,也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING -3. mangle功能:修改报文原数据,是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING +1. filter表:(主要对数据包进行过滤) 定义允许或者不允许的,只能做在3个链上:INPUT ,FORWARD ,OUTPUT +2. nat表:(主要用于修改数据包的IP地址、端口号等) 定义地址转换的,也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING +3.mangle表: +修改报文原数据,是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。 - +4.Raw表:(主要用于决定数据包是否被状态跟踪机制处理,在匹配raw表时优先于其他表) + 小扩展: - 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT @@ -194,61 +239,6 @@ iptables还支持自己定义链。但是自己定义的链,必须是跟某种 ### 实例 -#### 空当前的所有规则和计数 - -```bash -iptables -F # 清空所有的防火墙规则 -iptables -X # 删除用户自定义的空链 -iptables -Z # 清空计数 -``` - -#### 配置允许ssh端口连接 - -```bash -iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT -# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求 -``` - -#### 允许本地回环地址可以正常使用 - -```bash -iptables -A INPUT -i lo -j ACCEPT -#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许 -iptables -A OUTPUT -o lo -j ACCEPT -``` - -#### 设置默认的规则 - -```bash -iptables -P INPUT DROP # 配置默认的不让进 -iptables -P FORWARD DROP # 默认的不允许转发 -iptables -P OUTPUT ACCEPT # 默认的可以出去 -``` - -#### 配置白名单 - -```bash -iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问 -iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问 -iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口 -``` - -#### 开启相应的服务端口 - -```bash -iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口 -iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping -iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来 -``` - -#### 保存规则到配置文件中 - -```bash -cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯 -iptables-save > /etc/sysconfig/iptables -cat /etc/sysconfig/iptables -``` - #### 列出已设置的规则 > iptables -L [-t 表名] [链名] @@ -393,5 +383,458 @@ iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT ``` +```sh +iptables实现内外网隔离 +#!/bin/bash + +#赋值IPTABLES: +IPT="/sbin/iptables" + +#赋值外网IP: +FW_INET= 202.96.???.??? + +#赋值内网网卡和外网网卡,及vpn网卡 +IF_INET="eth0" +IF_LOCAL="eth1" +IF_OVPN="tun+" + +#赋值内部vlan: +LAN_1="192.168.1.0/24" +LAN_2="192.168.2.0/24" +LAN_3="192.168.3.0/24" + +#赋值总部与分公司的VPN 外网IP. +OVPN_HEADER="202.96.???.???" 本机防火墙外部IP +OVPN_SUBCOMPANY="202:128.???.???" 子公司防火墙外部IP + +#赋值服务器IP +DNS/DHCP=192.168.1.??? +EMAIL_LOCAL= 192.168.1.??? +DOMAIN_SERVER=192.168.1.??? +ANTIVIRUS_SERVER=192.168.1.??? +FILE_SERVER=192.168.1.??? +DATABASE_SERVER=192.168.1.??? + +#赋值VLAN网段可出外网 +INTERNET1_FULL_ACCESS_1="192.168.1.100-192.168.1.160" +INTERNET2_FULL_ACCESS_2="192.168.2.50-192.168.2.70" +INTERNET3_FULL_ACCESS_3="192.168.3.40-192.168.3.99" +USERS_FULL_ACCESS= +SKYPE_USERS=" 192.168.1.200 192.168.2.200 192.168.3.200" +BLOCKED_HOSTS="" + +#装载IPTABLES模块 +modprobe nf_nat_ftp + +#清空所有的防火墙设置 +$IPT -F INPUT +$IPT -F FORWARD +$IPT -F FORWARD -t mangle +$IPT -F OUTPUT +$IPT -t nat -F OUTPUT +$IPT -t nat -F POSTROUTING +$IPT -t nat -F PREROUTING + +#设置默认拒绝所有输入和转发数据包 +$IPT -P INPUT DROP +$IPT -P FORWARD DROP + +#允许所有数据包通过OPENVPN网络接口 +$IPT -A INPUT -i lo -j ACCEPT +$IPT -A INPUT -i $IF_LOCAL -j ACCEPT +$IPT -A INPUT -i $IF_OVPN -j ACCEPT + +#打开SSH端口访问 +$IPT -A INPUT -p tcp --dport 22 -j ACCEPT + +#充许OPENPN访问 +$IPT -A INPUT -p tcp -s $OVPN_SUBCOMPANY -d $OVPN_HEADER --dport 55001 -j ACCEPT + +#拒绝访问的IP: +$IPT -I INPUT -s $BLOCKED_IPS -j DROP +$IPT -I FORWARD -s $BLOCKED_IPS -j DROP + +#邮件服务器端口设置: +$IPT -A FORWARD -s $EMAIL_LOCAL -j ACCEPT +$IPT -A FORWARD -d $EMAIL_LOCAL -j ACCEPT +$IPT -t nat -A POSTROUTING -s $EMAIL_LOCAL -j MASQUERADE +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 25 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 80 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 110 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 143 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 587 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 993 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 995 -j DNAT --to $EMAIL_LOCAL +$IPT -t nat -A PREROUTING -i $IF_INET -p tcp -d $FW_INET --dport 1925 -j DNAT --to-destination $EMAIL_LOCAL:25 + +#DNS服务器: +$IPT -A FORWARD -p tcp --sport 1024: -s $DNS/DHCP --dport 53 -j ACCEPT +$IPT -t nat -A POSTROUTING -p tcp --sport 1024: -s $DNS/DHCP --dport 53 -j MASQUERADE +$IPT -A FORWARD -p udp --sport 1024: -s $DNS/DHCP --dport 53 -j ACCEPT +$IPT -t nat -A POSTROUTING -p udp --sport 1024: -s $DNS/DHCP --dport 53 -j MASQUERADE +$IPT -A FORWARD -p tcp --sport 1024: -s $DNS/DHCP --dport 80 -j ACCEPT #允许服务器更新 +$IPT -t nat -A POSTROUTING -p tcp --sport 1024: -s $DNS/DHCP --dport 80 -j MASQUERADE + +#域服务器内外转发 +$IPT -A FORWARD -s $DOMAIN_SERVER -j ACCEPT +$IPT -t nat -A POSTROUTING -s $DOMAIN_SERVER -j MASQUERADE + +#抗病毒服务器内外转发 +$IPT -A FORWARD -s $PA_NETFLOW -j ACCEPT +$IPT -t nat -A POSTROUTING -s $PA_NETFLOW -j MASQUERADE + +#内外网隔离,VLAN IP段可访问外网设置 +$IPT -A FORWARD -m iprange --src-range $INTERNET1_FULL_ACCESS -j ACCEPT +$IPT -t nat -A POSTROUTING -m iprange --src-range $INTERNET1_FULL_ACCESS ! -d 192.168.0.0/16 -j MASQUERADE +$IPT -A FORWARD -m iprange --src-range $INTERNET2_FULL_ACCESS -j ACCEPT +$IPT -t nat -A POSTROUTING -m iprange --src-range $INTERNET2_FULL_ACCESS ! -d 192.168.0.0/16 -j MASQUERADE +$IPT -A FORWARD -m iprange --src-range $INTERNET3_FULL_ACCESS -j ACCEPT +$IPT -t nat -A POSTROUTING -m iprange --src-range $INTERNET3_FULL_ACCESS ! -d 192.168.0.0/16 -j MASQUERADE + +#外网代理端口 +$IPT -A FORWARD -p tcp -s $LAN_1 --dport 443 -j ACCEPT +$IPT -t nat -A POSTROUTING -p tcp -s $LAN_1 --dport 443 -j MASQUERADE +$IPT -A FORWARD -p tcp -s $LAN_2 --dport 443 -j ACCEPT +$IPT -t nat -A POSTROUTING -p tcp -s $LAN_2 --dport 443 -j MASQUERADE +$IPT -A FORWARD -p tcp -s $LAN_3 --dport 443 -j ACCEPT +$IPT -t nat -A POSTROUTING -p tcp -s $LAN_3 --dport 443 -j MASQUERADE + +``` + +### Netfilter/Iptables Layer7 应用层过滤策略 + +```sh +iptables安装 +wget http://download.clearfoundation.com/l7-filter/netfilter-layer7-v2.23.tar.gz +wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.9.tar.bz2 +wget http://download.clearfoundation.com/l7-filter/l7-protocols-2009-05-28.tar.gz +wget http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/iptables-1.4.7-11.el6.src.rpm + +Netfilter/Iptables 作为一个典型的包过滤防火墙体系,对于网络层,传输层的数据包过滤具有非常优秀的性能和效率,然而,对于一些面向局域网上网用户的Linux网关服务器,有时候还需要对QQ,MSN等聊天,使用BT下载工具等现象进行封锁。下面将介绍如何为Netfilter/Iptables 增加应用层过滤。 + +QQ,MSN等聊天,使用BT下载工具均使用了相对固定的应用层协议。使用L7-filter项目的补丁文件包可以为linux内核增加相应的应用层过滤功能,结合其提供的l7-protocols第7层协议定义包,能够识别不同应用层的数据特征 + +L7-filter项目站点:http://l7-filter.sourceforge.net/ 下载最新的补丁包及协议包内核站点:http://www.kernel.org 下载内核,iptables的源码包 + +将netfilter-layer7 源码包中的对应补丁文件添加到内核源码中,对内核进行重新编译,安装,安装后使用新内核启动Linux操作系统。 + +注意:L7-filter补丁包内的数据,要与内核及iptables源码版本相匹配 +注意:源码目录所在分区至少保持有2.5G的剩余磁盘空间。 + +========编译安装内核======== + +1.解压释放netfilter-layer7 和内核源码包,使用patch工具合并补丁文件 + tar xf linux-2.6.35.9.tar.bz2 -C /usr/src/ + tar xf netfilter-layer7-v2.23.tar.gz + cd /usr/src + ln -sn linux-2.6.35.9/ linux + ll linux* -d + lrwxrwxrwx 1 root root 15 Aug 26 10:55 linux -> linux-2.6.35.9/ + drwxrwxr-x 23 root root 4096 Nov 23 2010 linux-2.6.35.9 + + cd linux + patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.35-layer7-2.23.patch + patching file include/linux/netfilter/xt_layer7.h + patching file include/net/netfilter/nf_conntrack.h + patching file net/netfilter/Kconfig + patching file net/netfilter/Makefile + patching file net/netfilter/nf_conntrack_core.c + patching file net/netfilter/nf_conntrack_standalone.c + patching file net/netfilter/regexp/regexp.c + patching file net/netfilter/regexp/regexp.h + patching file net/netfilter/regexp/regmagic.h + patching file net/netfilter/regexp/regsub.c + patching file net/netfilter/xt_layer7.c + 注意:【patch -p1 】 中“1” 是数字 1,不是小写字母 L + +2.重新配置内核编译参数,添加state机制及layer7支持【仍在内核编译目录】 + cp /boot/config-2.6.32-431.el6.x86_64 .config + yum -y install gcc ncurses-devel + make menuconfig + + 在配置界面中,方向键用于定位需要配置的项目 + select 进入子配置菜单 + exit 返回上一层 + help 查看帮助信息 + 空格 切换所选项目的编译类型 + 三种状态: + [] 表示不需要该功能 + [M] 将功能编译成模块 + [*] 将功能直接编入内核 + + Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) + ---> Core Netfilter Configuration ---> + Netfilter connection tracking support + "layer7" match support + "string" match support + "time" match support + "iprange" address range match support + "connlimit" match support" + "state" match support + "conntrack" connection match support + "mac" address match support + "multiport" Multiple port match support + + Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) + ---> IP: Netfilter Configuration ---> + IPv4 connection tracking support (required for NAT) + Full NAT + MASQUERADE target support + NETMAP target support + REDIRECT target support + + 使用Exit返回 最后当提示保存时,使用Yes确认保存,修改将保存到源码目录中的.config文件中。 + +3.编译新内核,并安装新内核文件 + make + make modules_install && make install + + 新内核编译安装过程将花费较长时间,数十分钟到数小时不等 + 新内核文件被安装到/boot目录,模块文件将复制到/lib/modules/2.6.35.9 + + 如果编译内核,途中断过,想重新编译,那么先使用 + make mrproper 删除不必要的文件和目录,初次编译内核不需要 + make clean 删除不必要的模块和文件 + 然后重新 make menuconfig + +4.调整GRUB引导菜单,使系统以新内核启动,然后重启linux服务器 从新版内核启动 + vim /boot/grub/grub.conf 【修改default=0 ,1改为0】 + default=0 + timeout=5 + splashimage=(hd0,1)/boot/grub/splash.xpm.gz + hiddenmenu + title CentOS (2.6.35.9) + root (hd0,1) + reboot + +======安装iptables/l7-protocols协议包======= + +1、制作iptables升级包 + 新建mockbuild用户,将l7-protocols-2009-05-28.tar.gz解压后的用于iptables 1.4.3和内核2.6.20之后的文件复制过来。 + 注意目录层次。 + + useradd mockbuild + rpm -ivh iptables-1.4.7-11.el6.src.rpm + warning: iptables-1.4.7-11.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY + 1:iptables ########################################### [100%] + cd /root/rpmbuild/SOURCES/ + tar xf iptables-1.4.7.tar.bz2 + cd iptables-1.4.7 + cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* ./extensions/ + cd .. + tar -jcf iptables-1.4.7.tar.bz2 iptables-1.4.7/* + mv iptables-1.4.7/ /tmp/ + cd ../SPECS/ + vim iptables.spec + Version: 1.4.7 + Release: 11.5%{?dist} //修改11.5表示升级 + + CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" + --with-kernel=/usr/src/linux --with-kbuild=/usr/src/linux --with-ksource=/usr/src/linux + //最后 三项 参数改为编译 的内核 linux所在目录 + %changelog + * Wed May 17 2016 Fisher 1.4.7-11.5 + - L7-filter support //在 %changelog 后添加这两段,加入更新日志(日期为当天) + + yum install rpm-build libselinux-devel -y + rpmbuild -ba iptables.spec + + +2、开始升级iptables + cd /root/rpmbuild/RPMS/x86_64/ + rpm -Uvh iptables-1.4.7-11.5.el6.x86_64.rpm iptables-ipv6-1.4.7-11.5.el6.x86_64.rpm //可加参数 --nodeps 强制安装 + cd /tmp + tar xf l7-protocols-2009-05-28.tar.gz + cd l7-protocols-2009-05-28 + make install + mkdir -p /etc/l7-protocols + cp -R * /etc/l7-protocols + +3、检查l7-protocols协议包 + rpm -ql iptables | grep layer7 + /lib64/xtables/libxt_layer7.so + + +========启用七层过滤/添加规则============ + +1、启用七层过滤 + # modprobe xt_layer7 + # lsmod | grep xt_layer7 + xt_layer7 12060 0 + nf_conntrack 79850 1 xt_layer7 + +2、查看并开启内核参数,确保net.netfilter.nf_conntrack_acct等于1 + # sysctl -a | grep conntrack_acct + net.netfilter.nf_conntrack_acct = 1 + +3、在Iptables上做7层防火墙过虑限制 + vim /etc/sysctl.conf + net.ipv4.ip_forward = 1 //开启路由转发功能 + sysctl -p + lsmod | grep -w nf_conntrack //查看nf_conntrack模块是否加载 + nf_conntrack 79485 6 + xt_layer7,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state + + sysctl -a | grep acct //查看内核连接追踪功能是否开启 + kernel.acct = 4 2 30 + ###如果下面值为0,修改为1 + net.netfilter.nf_conntrack_acct = 1 + ###打开下面文件加入到里面执行如下命令即可生效 + vim /etc/sysctl.conf + net.netfilter.nf_conntrack_acct = 1 + sysctl -p + ###也可使用此项命令修改,但一重启系统便会失效 + sysctl -w net.netfilter.nf_conntrack_acct=1 + +4、添加规则 + 支持的layer7应用层协议 + 匹配格式:iptables [-t 表名] -m layer7 --l7proto 协议名 + 根据时间过滤 + 匹配格式:-m time --timestart 起始时间 --timestop 结束时间 --weekdays 每周的那些天 + 时间格式以24小时制表示,如早9:30 晚18:00 + 每周一至周日对应的英文缩写表示为:Mon、Tue、Wed、Thu、Fri、Sat、Sun 也可以使用数字表示周一至周日,如:1、2、3、4、5、6、7 + 根据字符串过滤 + 匹配格式:-m string --string “字符串” --algo {bm|kmp} + 实例: + 使用layer7显示匹配策略过滤使用QQ,MSN Edonkey等应用层协议的数据访问 + iptables -A FORWARD -m layer7 --l7proto qq -j DROP + iptables -A FORWARD -m layer7 --l7proto msn-filetransfer -j DROP + iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP + iptables -A FORWARD -m layer7 --l7proto bittorrenr -j DROP + iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP + iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP + 使用--connlimit 显示匹配进行数据并发连接控制,超过100个并发连接将拒绝 + iptables -A FORWARD -p tcp --syn -m connlimit --connlimit-above 100 -j DROP + + 使用--time显示匹配根据时间范围设置访问策略,允许周一到周五 8:00-18:00之间的数据访问 + iptables -A FORWARD -p tcp --dport 80 -m time --timestart 8:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT + 星期一 MON 星期二 TUE 星期三 WED 星期四 THU 星期五 FRI 星期六 SAT 星期天 SUN + + 使用string显示匹配策略过滤包含tencent,verycd,色情,成人电影的网络访问 + iptables -A FORWARD -m string --string "qq" --algo bm -j DROP + iptables -A FORWARD -m string --string "tencent" --algo bm -j DROP + iptables -A FORWARD -m string --string "verycd" --algo bm -j DROP + iptables -A FORWARD -m string --string "色情" --algo bm -j DROP + iptables -A FORWARD -m string --string "成人电影" --algo bm -j DROP + 其中--algo参数用于指定字符串识别算法,bm 或 kmp + + +5、查看支持的协议簇 + ls /etc/l7-protocols/protocols/ + +=======问题汇总======= + +1、在make 内核过程中报 【gcc: error: elf_x86_64: No such file or directory】 + 解决:gcc -v ,若gcc 版本为4.6 ,则不支持 linker-style 架构 + 在内核目录arch/x86/vdso/Makefile中,大约在28,29行 找到 + VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,-soname=linux-vdso.so.1 \ + -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 + 把"-m elf_x86_64" 替换为 "-m64" + 然后再继续找,大约在72行左右,找到 + VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1 + 中的 "-m elf_i386" 替换为 "-m32" + +2、在make 内核过程中报【drivers/net/igbvf/igbvf.h:129:15: 错误:重复的成员‘page’】 + 解决:打开文件,看129行,代码为:struct page *page;再往上看,第124行,也有struct page *page这行代码, + 这个结构定义在内部的一个结构体中。就是他的名字与129行的重复了,而4.6.*的编译器不支持这种方式的定义, + 我们修改129行的代码为struct page *pagep;保存退出 + +3、在rpmbuild -bb iptables.spec 制作rpm包报 【*** ERROR: No build ID note found in /home/wuyang/rpmbuild/BUILDROOT/****** + error: Bad exit status from /var/tmp/rpm-tmp.BPd1OI (%install)】 + 解决:在iptables.spec文件中任意位置添加如下参数: + %define __debug_install_post \ + %{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\ + %{nil} + + 重新打包 + + +允许某个IP段远程访问ssh +iptables -A INPUT -p tcp -m tcp --dport 9527 -s 192.168.64.0/24 -j ACCEPT +开启80端口 +iptables -A INPUT -P tcp -m tcp --dropt 80 -j ACCEPT +允许某个IP的所有请求 +iptables -A INPUT -p all -s 124.43.56.90/30 -j ACCEPT +iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT +iptables -P INPUT DROP +iptables -P OUTPUT ACCEPT +iptables -P FORWARD DROP +/etc/init.d/iptables save +/etc/init.d/iptables restart + + + +1. 删除已有规则 +在新设定iptables规则时,我们一般先确保旧规则被清除,用以下命令清除旧规则: +iptables -F +(or iptables --flush) +2. 设置chain策略 +对于filter table,默认的chain策略为ACCEPT,我们可以通过以下命令修改chain的策略: +iptables -P INPUT DROP +iptables -P FORWARD DROP +iptables -P OUTPUT DROP +以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当 +进一步配置其他规则的时候,需要注意针对INPUT和OUTPUT分别配置。当然,如果信任本机器往外发包, +以上第三条规则可不必配置。 +3. 屏蔽指定ip +有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃: +BLOCK_THIS_IP="x.x.x.x"iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP +以上命令设置将由x.x.x.x ip发往eth0网口的tcp包丢弃。 +4. 配置服务项 +利用iptables,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过 +SSH连接本机: +iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT +iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT +若要支持由本机通过SSH连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则: +iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT +iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT +类似的,对于HTTP/HTTPS(80/443)、pop3(110)、rsync(873)、MySQL(3306)等基于tcp连接的服务,也可以参 +照上述命令配置。 +对于基于udp的dns服务,使用以下命令开启端口服务: +iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT +iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT +5. 网口转发配置 +对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信, +假设eth0连接内网,eth1连接公网,配置规则如下: +iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT +6. 端口转发配置 +对于端口,我们也可以运用iptables完成转发配置: +iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22 +以上命令将422端口的包转发到22端口,因而通过422端口也可进行SSH连接,当然对于422端口,我们也需要 +像以上“4.配置服务项”一节一样,配置其支持连接建立的规则。 +7. DoS攻击防范 +利用扩展模块limit,我们还可以配置iptables规则,实现DoS攻击防范: +iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT +–litmit 25/minute 指示每分钟限制最大连接数为25 +–litmit-burst 100 指示当总连接数超过100时,启动 litmit/minute 限制 +8. 配置web流量均衡 +我们可以将一台服务器作为前端服务器,利用iptables进行流量分发,配置方法如下: +iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j +DNAT --to-destination 192.168.1.101:80 +iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j +DNAT --to-destination 192.168.1.102:80 +iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j +DNAT --to-destination 192.168.1.103:80 +以上配置规则用到nth扩展模块,将80端口的流量均衡到三台服务器。 +9. 将丢弃包情况记入日志 +使用LOG目标和syslog服务,我们可以记录某协议某端口下的收发包情况。拿记录丢包情况举例,可以通过以 +下方式实现。 +首先自定义一个chain: +iptables -N LOGGING +其次将所有接收包导入LOGGING chain中: +iptables -A INPUT -j LOGGING +然后设置日志前缀、日志级别: +iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7 +最后将包倒向DROP,将包丢弃: +iptables -A LOGGING -j DROP +另可以配置syslog.conf文件,指定iptables的日志输出。 +ps -eo"pid,stime,args" +ps -eo rss,pmem,pcpu,vsize,args | sort -k 1 -r -n | less + + + + + +``` diff --git a/LearnShell/LinuxCommands/iptraf.md b/LearnShell/LinuxCommands/iptraf.md old mode 100644 new mode 100755 index c345aa4..0200f4e --- a/LearnShell/LinuxCommands/iptraf.md +++ b/LearnShell/LinuxCommands/iptraf.md @@ -1,6 +1,6 @@ iptraf === - + 实时地监视网卡流量 ## 补充说明 diff --git a/LearnShell/LinuxCommands/iptstate.md b/LearnShell/LinuxCommands/iptstate.md old mode 100644 new mode 100755 index f464b0c..598b2d5 --- a/LearnShell/LinuxCommands/iptstate.md +++ b/LearnShell/LinuxCommands/iptstate.md @@ -1,6 +1,6 @@ iptstate === - + 显示iptables的工作状态 ## 补充说明 diff --git a/LearnShell/LinuxCommands/kill.md b/LearnShell/LinuxCommands/kill.md old mode 100644 new mode 100755 index d845ee0..3c762b3 --- a/LearnShell/LinuxCommands/kill.md +++ b/LearnShell/LinuxCommands/kill.md @@ -1,6 +1,6 @@ kill === - + 删除执行中的程序或工作 ## 补充说明 diff --git a/LearnShell/LinuxCommands/last.md b/LearnShell/LinuxCommands/last.md old mode 100644 new mode 100755 index 4f07127..96e3a9e --- a/LearnShell/LinuxCommands/last.md +++ b/LearnShell/LinuxCommands/last.md @@ -1,6 +1,6 @@ last === - + 列出目前与过去登入系统的用户相关信息 ## 补充说明 diff --git a/LearnShell/LinuxCommands/less.md b/LearnShell/LinuxCommands/less.md old mode 100644 new mode 100755 index d4a4dbb..36e5641 --- a/LearnShell/LinuxCommands/less.md +++ b/LearnShell/LinuxCommands/less.md @@ -1,6 +1,6 @@ less === - + 分屏上下翻页浏览文件内容 ## 补充说明 @@ -30,10 +30,5 @@ less(选项)(参数) 文件:指定要分屏显示内容的文件。 -## 实例 - -```bash -sudo less /var/log/shadowsocks.log -``` - + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/ln.md b/LearnShell/LinuxCommands/ln.md old mode 100644 new mode 100755 index 2b1e8eb..698c7f1 --- a/LearnShell/LinuxCommands/ln.md +++ b/LearnShell/LinuxCommands/ln.md @@ -1,112 +1,120 @@ -ln -=== - -用来为文件创件连接 - -## 补充说明 - -**ln命令** 用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。 - -注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。 - -### 语法 - -``` -ln [选项]... [-T] 目标 链接名 (第一种格式) - 或:ln [选项]... 目标 (第二种格式) - 或:ln [选项]... 目标... 目录 (第三种格式) - 或:ln [选项]... -t 目录 目标... (第四种格式) -``` - -### 选项 - -``` - --backup[=CONTROL] 为每个已存在的目标文件创建备份文件 --b 类似--backup,但不接受任何参数 --d, -F, --directory 创建指向目录的硬链接(只适用于超级用户) --f, --force 强行删除任何已存在的目标文件 --i, --interactive 覆盖既有文件之前先询问用户; --L, --logical 取消引用作为符号链接的目标 --n, --no-dereference 把符号连接的目的目录视为一般文件; --P, --physical 直接将硬链接到符号链接 --r, --relative 创建相对于链接位置的符号链接 --s, --symbolic 对源文件建立符号连接,而非硬连接; --S, --suffix=SUFFIX 用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它; --t, --target-directory=DIRECTORY 指定要在其中创建链接的DIRECTORY --T, --no-target-directory 将“LINK_NAME”视为常规文件 --v, --verbose 打印每个链接文件的名称 - --help 显示此帮助信息并退出 - --version 显示版本信息并退出 -``` - -### 参数 - -* 源文件:指定连接的源文件。如果使用`-s`选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件; -* 目标文件:指定源文件的目标连接文件。 - -```bash -none, off # 不进行备份(即使使用了--backup 选项) -numbered, t # 备份文件加上数字进行排序 -existing, nil # 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份 -simple, never # 永远使用普通方式备份 -``` - -### 实例 - -将目录`/usr/mengqc/mub1`下的文件m2.c链接到目录`/usr/liu`下的文件a2.c - -``` -cd /usr/mengqc -ln /mub1/m2.c /usr/liu/a2.c -``` - -在执行ln命令之前,目录`/usr/liu`中不存在a2.c文件。执行ln之后,在`/usr/liu`目录中才有a2.c这一项,表明m2.c和a2.c链接起来(注意,二者在物理上是同一文件),利用`ls -l`命令可以看到链接数的变化。 - -在目录`/usr/liu`下建立一个符号链接文件abc,使它指向目录`/usr/mengqc/mub1` - -``` -ln -s /usr/mengqc/mub1 /usr/liu/abc -``` - -执行该命令后,`/usr/mengqc/mub1`代表的路径将存放在名为`/usr/liu/abc`的文件中。 - -## 扩展知识 - -Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。 - -文件链接有两种形式,即硬链接和符号链接。 - -### 硬链接 - -建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。 - -创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为l。 - -在默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理地删除。 - -对硬链接有如下限制: - -* 不能对目录文件做硬链接。 -* 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。 - -### 符号链接 - -符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件(如图中的abc文件),其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。 - -!符号连接 - -与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件。 - -符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。 - -用`ln -s`命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。 - -符号链接保持了链接与源文件或目录之间的区别: - -* 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。 -* 在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。 -* 符号链接的大小是其链接文件的路径名中的字节数。 -* 当用`ln -s`命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如`lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file`其中,表示“文件大小”的数字“14”恰好说明源文件名`original_file`由14个字符构成。 - - - +ln +=== + +用来为文件创件连接 + +## 补充说明 + +**ln命令** 用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。 + +注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。 + +软连接特点: +1.软连接的权限都是rwxrwxrwx,文件类型是l,时间值和原文件的时间值不同; +2.类似于windows中的快捷方式操作; +3.源文件和链接文件同步更新; +4支持跨文件系统创建链接文件; + +### 语法 + +``` +ln [选项]... [-T] 目标 链接名 (第一种格式) + 或:ln [选项]... 目标 (第二种格式) + 或:ln [选项]... 目标... 目录 (第三种格式) + 或:ln [选项]... -t 目录 目标... (第四种格式) +``` + +### 选项 + +``` +-b或--backup:删除,覆盖目标文件之前的备份; +-d或-F或——directory:建立目录的硬连接; +-f或——force:强行建立文件或目录的连接,不论文件或目录是否存在; +-i或——interactive:覆盖既有文件之前先询问用户; +-n或--no-dereference:把符号连接的目的目录视为一般文件; +-s或——symbolic:对源文件建立符号连接,而非硬连接; +-S<字尾备份字符串>或--suffix=<字尾备份字符串>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它; +-v或——verbose:显示指令执行过程; +-V<备份方式>或--version-control=<备份方式>:用“-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用“-S”参数变更,当使用“-V”参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串; +--help:在线帮助; +--version:显示版本信息。 +``` + +### 参数 + +* 源文件:指定连接的源文件。如果使用`-s`选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件; +* 目标文件:指定源文件的目标连接文件。 + +### 实例 + +将目录`/usr/mengqc/mub1`下的文件m2.c链接到目录`/usr/liu`下的文件a2.c + +``` +cd /usr/mengqc +ln /mub1/m2.c /usr/liu/a2.c +``` + +在执行ln命令之前,目录`/usr/liu`中不存在a2.c文件。执行ln之后,在`/usr/liu`目录中才有a2.c这一项,表明m2.c和a2.c链接起来(注意,二者在物理上是同一文件),利用`ls -l`命令可以看到链接数的变化。 + +在目录`/usr/liu`下建立一个符号链接文件abc,使它指向目录`/usr/mengqc/mub1` + +``` +ln -s /usr/mengqc/mub1 /usr/liu/abc +``` + +执行该命令后,`/usr/mengqc/mub1`代表的路径将存放在名为`/usr/liu/abc`的文件中。 + +## 扩展知识 + +Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。 + +文件链接有两种形式,即硬链接和符号链接。 + +### 硬链接 + +硬链接特点: +1.源文件和硬链接文件的属性完全相同; +2.类似于cp -p 复制文件指令,不同之处是时间值不同; +3.硬链接是同步更新的; +4.硬链接不能跨文件系统,类似于跨分区....(实质上文件系统就是一个初始化后的分区,属于独立存储空间,同时在文件的逻辑结构上是隶属于根目录) + +建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。 + +创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为l。 + +在默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理地删除。 + +对硬链接有如下限制: + +* 不能对目录文件做硬链接。 +* 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。 + +### 软,硬链接不同点: +1.如果源文件被删除的话,软连接文件只是一个符号链接,因此软连接文件不可访问。硬链接文件是可以访问的,相当于源文件的一个拷贝,大小内容是一样的,同步更新。 + +为了更好的理解两者的不同点,下面来分析一下软硬链接的原理: +在Linux系统中最核心的部分是内核,其功能是负责处理几乎所有的事情,但处理过程中不能识别字母,只能识别数字,因此在处理的过程中要有一个数字标识来标记,我们称之为i节点;(uid ,gid ,pid 等数字标识)每个文件都有一个i节点,如果没有的话就没有办法访问目标文件; + +硬链接和源文件有相同的i节点--inode映射到了两个文件,删除一个就减掉一个映射,还有另一条映射因此不影响对文件的访问。内核查看inode都是相同的数字,同步在两个文件中写入,而且并不知道那个是源文件那个是硬链接文件,这就是硬链接为什么会同步更新; + +切记:i节点是内核调用的数字标识; + +### 符号链接 + +符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件(如图中的abc文件),其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。 + +符号连接与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件。 + +符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。 + +用`ln -s`命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。 + +符号链接保持了链接与源文件或目录之间的区别: + +* 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。 +* 在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。 +* 符号链接的大小是其链接文件的路径名中的字节数。 +* 当用`ln -s`命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如`lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file`其中,表示“文件大小”的数字“14”恰好说明源文件名`original_file`由14个字符构成。 + + + diff --git a/LearnShell/LinuxCommands/locale.md b/LearnShell/LinuxCommands/locale.md new file mode 100755 index 0000000..0be2d74 --- /dev/null +++ b/LearnShell/LinuxCommands/locale.md @@ -0,0 +1,26 @@ +locale +=== + +```sh +locate [选择参数] [样式] +``` + +选项 + +```sh +-e 将排除在寻找的范围之外。 +-1 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。 +-f 将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案 放在资料库中。 +-q 安静模式,不会显示任何错误讯息。 +-n 至多显示 n个输出。 +-r 使用正规运算式 做寻找的条件。 +-o 指定资料库存的名称。 +-d 指定资料库的路径 +-h 显示辅助讯息 +-V 显示程式的版本讯息 +``` + +实例 + +显示所支持语系:locale + diff --git a/LearnShell/LinuxCommands/locate.md b/LearnShell/LinuxCommands/locate.md old mode 100644 new mode 100755 index 39cb776..b17cdb7 --- a/LearnShell/LinuxCommands/locate.md +++ b/LearnShell/LinuxCommands/locate.md @@ -7,13 +7,12 @@ Apache服务器的性能测试工具 locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。 -locate命令可以在搜寻数据库时快速找到档案,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab) +locate命令可以在搜寻数据库时快速找到档案,数据库(/var/lib/locatedb)由updatedb程序来更新,数据库含有本地所有的文件信息,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab) locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*” 或”?”等)来指定范本样式,如指定范本为kcpa*ner, locate 会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。 locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。 - ### 语法 ``` @@ -37,7 +36,7 @@ locate [选择参数] [样式] ### 实例 -实例1:查找和pwd相关的所有文件 +查找和pwd相关的所有文件 ``` root ~ # locate pwd @@ -58,8 +57,7 @@ root ~ # locate pwd /usr/share/help/el/empathy/irc-join-pwd.page ``` -实例2: 搜索etc目录下所有以sh开头的文件 - +搜索etc目录下所有以sh开头的文件 ``` root ~ # locate /etc/sh /etc/shadow @@ -67,8 +65,7 @@ root ~ # locate /etc/sh /etc/shells ``` -实例3:搜索etc目录下,所有以m开头的文件 - +搜索etc目录下,所有以m开头的文件 ``` root ~ # locate /etc/m /etc/magic @@ -79,4 +76,19 @@ root ~ # locate /etc/m /etc/mate-settings-daemon ``` +搜索etc目录下所有以sh开头的文件。 +``` +locate /etc/sh +``` + +搜索用户主目录下,所有以m开头的文件。 +``` +locate ~/m +``` + +搜索用户主目录下,所有以m开头的文件,并且忽略大小写。 +``` +locate -i ~/m +``` + diff --git a/LearnShell/LinuxCommands/ls.md b/LearnShell/LinuxCommands/ls.md old mode 100644 new mode 100755 index 7061100..d963dab --- a/LearnShell/LinuxCommands/ls.md +++ b/LearnShell/LinuxCommands/ls.md @@ -16,105 +16,30 @@ ls(选项)(参数) ### 选项 ``` - --a, --all 不隐藏任何以. 开始的项目 --A, --almost-all 列出除. 及.. 以外的任何项目 - --author 与-l 同时使用时列出每个文件的作者 --b, --escape 以八进制溢出序列表示不可打印的字符 - --block-size=SIZE scale sizes by SIZE before printing them; e.g., - '--block-size=M' prints sizes in units of - 1,048,576 bytes; see SIZE format below --B, --ignore-backups do not list implied entries ending with ~ --c with -lt: sort by, and show, ctime (time of last - modification of file status information); - with -l: show ctime and sort by name; - otherwise: sort by ctime, newest first --C list entries by columns - --color[=WHEN] colorize the output; WHEN can be 'never', 'auto', - or 'always' (the default); more info below --d, --directory list directories themselves, not their contents --D, --dired generate output designed for Emacs' dired mode --f do not sort, enable -aU, disable -ls --color --F, --classify append indicator (one of */=>@|) to entries - --file-type likewise, except do not append '*' - --format=WORD across -x, commas -m, horizontal -x, long -l, - single-column -1, verbose -l, vertical -C - --full-time like -l --time-style=full-iso --g 类似-l,但不列出所有者 - --group-directories-first - group directories before files; - can be augmented with a --sort option, but any - use of --sort=none (-U) disables grouping --G, --no-group 以一个长列表的形式,不输出组名 --h, --human-readable 与-l 一起,以易于阅读的格式输出文件大小 - (例如 1K 234M 2G) - --si 同上面类似,但是使用1000 为基底而非1024 --H, --dereference-command-line - follow symbolic links listed on the command line - --dereference-command-line-symlink-to-dir - follow each command line symbolic link - that points to a directory - --hide=PATTERN do not list implied entries matching shell PATTERN - (overridden by -a or -A) - --indicator-style=WORD append indicator with style WORD to entry names: - none (default), slash (-p), - file-type (--file-type), classify (-F) --i, --inode print the index number of each file --I, --ignore=PATTERN do not list implied entries matching shell PATTERN --k, --kibibytes default to 1024-byte blocks for disk usage --l 使用较长格式列出信息 --L, --dereference 当显示符号链接的文件信息时,显示符号链接所指示 - 的对象而并非符号链接本身的信息 --m 所有项目以逗号分隔,并填满整行行宽 --n, --numeric-uid-gid 类似 -l,但列出UID 及GID 号 --N, --literal 输出未经处理的项目名称 (如不特别处理控制字符) --o 类似 -l,但不列出有关组的信息 --p, --indicator-style=slash 对目录加上表示符号"/" --q, --hide-control-chars print ? instead of nongraphic characters - --show-control-chars show nongraphic characters as-is (the default, - unless program is 'ls' and output is a terminal) --Q, --quote-name enclose entry names in double quotes - --quoting-style=WORD use quoting style WORD for entry names: - literal, locale, shell, shell-always, c, escape --r, --reverse 逆序排列 --R, --recursive 递归显示子目录 --s, --size 以块数形式显示每个文件分配的尺寸 --S sort by file size - --sort=WORD sort by WORD instead of name: none (-U), size (-S), - time (-t), version (-v), extension (-X) - --time=WORD with -l, show time as WORD instead of default - modification time: atime or access or use (-u) - ctime or status (-c); also use specified time - as sort key if --sort=time - --time-style=STYLE with -l, show times using style STYLE: - full-iso, long-iso, iso, locale, or +FORMAT; - FORMAT is interpreted like in 'date'; if FORMAT - is FORMAT1FORMAT2, then FORMAT1 applies - to non-recent files and FORMAT2 to recent files; - if STYLE is prefixed with 'posix-', STYLE - takes effect only outside the POSIX locale --t sort by modification time, newest first --T, --tabsize=COLS assume tab stops at each COLS instead of 8 --u with -lt: sort by, and show, access time; - with -l: show access time and sort by name; - otherwise: sort by access time --U do not sort; list entries in directory order --v natural sort of (version) numbers within text --w, --width=COLS assume screen width instead of current value --x list entries by lines instead of by columns --X sort alphabetically by entry extension --1 list one file per line - -SELinux options: - ---lcontext Display security context. Enable -l. Lines - will probably be too wide for most displays. --Z, --context Display security context so it fits on most - displays. Displays only mode, user, group, - security context and file name. ---scontext Display only security context and file name. - --help 显示此帮助信息并退出 - --version 显示版本信息并退出 +-a:显示所有档案及目录(连同隐藏档,开头为.文件一起罗列出来); +-A:显示全部文件和目录,连同隐藏文件,但不包括.和..这两个目录; +-C:多列显示输出结果。这是默认选项; +-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列; +-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符; +-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出; +-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间; +-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表; +-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果; +-i:显示文件索引节点号(inode)。一个索引节点代表一个文件; +--file-type:与“-F”选项的功能相同,但是不显示“*”; +-k:以KB(千字节)为单位显示文件大小; +-h:将文件容量以人类易读的方式显示 +-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等; +-m:用“,”号区隔每个文件和目录的名称; +-n:以用户识别码和群组识别码替代其名称; +-r:以文件名反序排列并输出目录内容列表; +-s:显示文件和目录的大小,以区块为单位; +-S: 以文件大小排序,最大的优先(降序) +-t:用文件和目录的更改时间排序; +-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录; +-R:递归处理,将指定目录下的所有文件及子目录一并处理; +--full-time:列出完整的日期与时间; +--color[=WHEN]:使用不同的颜色高亮显示不同类型的。 ``` ### 参数 diff --git a/LearnShell/LinuxCommands/lsb_release.md b/LearnShell/LinuxCommands/lsb_release.md old mode 100644 new mode 100755 index ac648b0..cb346dd --- a/LearnShell/LinuxCommands/lsb_release.md +++ b/LearnShell/LinuxCommands/lsb_release.md @@ -5,6 +5,8 @@ lsb_release ## 补充说明 +yum install -y redhat-lsb + LSB是Linux Standard Base的缩写, **lsb_release命令** 用来显示LSB和特定版本的相关信息。如果使用该命令时不带参数,则默认加上-v参数。 ``` diff --git a/LearnShell/LinuxCommands/lsblk.md b/LearnShell/LinuxCommands/lsblk.md old mode 100644 new mode 100755 index 5be088d..49c6cd3 --- a/LearnShell/LinuxCommands/lsblk.md +++ b/LearnShell/LinuxCommands/lsblk.md @@ -1,6 +1,6 @@ lsblk === - + 列出块设备信息 ## 补充说明 diff --git a/LearnShell/LinuxCommands/lsof.md b/LearnShell/LinuxCommands/lsof.md old mode 100644 new mode 100755 index 23216ff..7d4a0cf --- a/LearnShell/LinuxCommands/lsof.md +++ b/LearnShell/LinuxCommands/lsof.md @@ -1,6 +1,6 @@ lsof === - + 显示Linux系统当前已打开的所有文件列表 ## 补充说明 diff --git a/LearnShell/LinuxCommands/man.md b/LearnShell/LinuxCommands/man.md old mode 100644 new mode 100755 index 8c8301f..f18ff66 --- a/LearnShell/LinuxCommands/man.md +++ b/LearnShell/LinuxCommands/man.md @@ -1,63 +1,140 @@ -man -=== - -查看Linux中的指令帮助 - -## 补充说明 - -**man命令** 是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 - -### 语法 - -``` -man(选项)(参数) -``` - -### 选项 - -``` --a:在所有的man帮助手册中搜索; --f:等价于whatis指令,显示给定关键字的简短描述信息; --P:指定内容时使用分页程序; --M:指定man手册搜索的路径。 -``` - -### 参数 - -* 数字:指定从哪本man手册中搜索帮助; -* 关键字:指定要搜索帮助的关键字。 - -### 数字代表内容 - -``` -1:用户在shell环境可操作的命令或执行文件; -2:系统内核可调用的函数与工具等 -3:一些常用的函数(function)与函数库(library),大部分为C的函数库(libc) -4:设备文件说明,通常在/dev下的文件 -5:配置文件或某些文件格式 -6:游戏(games) -7:惯例与协议等,如Linux文件系统,网络协议,ASCII code等说明 -8:系统管理员可用的管理命令 -9:跟kernel有关的文件 -``` - -### 实例 - -我们输入`man ls`,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输`man ifconfig`它会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。 - -man是按照手册的章节号的顺序进行搜索的,比如: - -``` -man sleep -``` - -只会显示sleep命令的手册,如果想查看库函数sleep,就要输入: - -``` -man 3 sleep -``` - - - - - +man +=== + +查看Linux中的指令帮助 + +## 补充说明 + +**man命令** 是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 + +### 语法 + +``` + + man [OPTION...] [章节] 手册页... + + -C, --config-file=文件 使用该用户设置文件 + -d, --debug 输出调试信息 + -D, --default 将所有选项都重置为默认值 + --warnings[=警告] 开启 groff 的警告 + + 主要运行模式: + -f, --whatis 等同于 whatis + -k, --apropos 等同于 apropos + -K, --global-apropos search for text in all pages + -l, --local-file + 把“手册页”参数当成本地文件名来解读 + -w, --where, --path, --location + 输出手册页的物理位置 + -W, --where-cat, --location-cat + 输出 cat 文件的物理位置 + + -c, --catman 由 catman 使用,用来对过时的 cat + 页重新排版 + -R, --recode=编码 output source page encoded in ENCODING + + 寻找手册页: + -L, --locale=区域 + 定义本次手册页搜索所采用的区域设置 + -m, --systems=系统 use manual pages from other systems + -M, --manpath=路径 设置搜索手册页的路径为“路径” + + -S, -s, --sections=列表 使用以半角冒号分隔的章节列表 + + -e, --extension=扩展 + 将搜索限制在扩展类型为“扩展”的手册页之内 + + -i, --ignore-case 查找手册页时不区分大小写字母 + (默认) + -I, --match-case 查找手册页时区分大小写字母。 + + --regex show all pages matching regex + --wildcard show all pages matching wildcard + + --names-only make --regex and --wildcard match page names only, + not descriptions + + -a, --all 寻找所有匹配的手册页 + -u, --update 强制进行缓存一致性的检查 + + --no-subpages don't try subpages, e.g. 'man foo bar' => 'man + foo-bar' + + 控制格式化的输出: + -P, --pager=PAGER 使用 PAGER 程序显示输出文本 + -r, --prompt=字符串 给 less pager 提供一个提示行 + + -7, --ascii 显示某些 latin1 字符的 ASCII 翻译形式 + -E, --encoding=编码 use selected output encoding + --no-hyphenation, --nh turn off hyphenation + --no-justification, --nj turn off justification + -p, --preprocessor=字符串 字符串表示要运行哪些预处理器: + e - [n]eqn, p - pic, t - tbl, +g - grap, r - refer, v - vgrind + + -t, --troff 使用 groff 对手册页排版 + -T, --troff-device[=设备] 使用 groff 的指定设备 + + -H, --html[=浏览器] 使用 elinks 或指定浏览器显示 HTML + 输出 + -X, --gxditview[=分辨率] 使用 groff 并通过 gxditview (X11) + 来显示: + -X = -TX75, -X100 = -TX100, -X100-12 = -TX100-12 + -Z, --ditroff 使用 groff 并强制它生成 ditroff + + -?, --help give this help list + --usage give a short usage message + -V, --version print program version + +Mandatory or optional arguments to long options are also mandatory or optional +for any corresponding short options. +``` + +### 选项 + +``` +-a:在所有的man帮助手册中搜索; +-f:等价于whatis指令,显示给定关键字的简短描述信息; +-P:指定内容时使用分页程序; +-M:指定man手册搜索的路径。 +``` + +### 参数 + +* 数字:指定从哪本man手册中搜索帮助; +* 关键字:指定要搜索帮助的关键字。 + +### 数字代表内容 + +``` +1:用户在shell环境可操作的命令或执行文件; +2:系统内核可调用的函数与工具等 +3:一些常用的函数(function)与函数库(library),大部分为C的函数库(libc) +4:设备文件说明,通常在/dev下的文件 +5:配置文件或某些文件格式 +6:游戏(games) +7:惯例与协议等,如Linux文件系统,网络协议,ASCII code等说明 +8:系统管理员可用的管理命令 +9:跟kernel有关的文件 +``` + +### 实例 + +我们输入`man ls`,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输`man ifconfig`它会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。 + +man是按照手册的章节号的顺序进行搜索的,比如: + +``` +man sleep +``` + +只会显示sleep命令的手册,如果想查看库函数sleep,就要输入: + +``` +man 3 sleep +``` + + + + + diff --git a/LearnShell/LinuxCommands/mkdir.md b/LearnShell/LinuxCommands/mkdir.md old mode 100644 new mode 100755 index 00e62a1..86f943d --- a/LearnShell/LinuxCommands/mkdir.md +++ b/LearnShell/LinuxCommands/mkdir.md @@ -1,6 +1,6 @@ mkdir === - + 用来创建目录 ## 补充说明 diff --git a/LearnShell/LinuxCommands/mkfs.md b/LearnShell/LinuxCommands/mkfs.md old mode 100644 new mode 100755 index 9927b45..baf6878 --- a/LearnShell/LinuxCommands/mkfs.md +++ b/LearnShell/LinuxCommands/mkfs.md @@ -1,6 +1,6 @@ mkfs === - + 用于在设备上创建Linux文件系统 ## 补充说明 diff --git a/LearnShell/LinuxCommands/mkfs.xfs.md b/LearnShell/LinuxCommands/mkfs.xfs.md new file mode 100755 index 0000000..e69de29 diff --git a/LearnShell/LinuxCommands/mknod.md b/LearnShell/LinuxCommands/mknod.md old mode 100644 new mode 100755 index 6c8cc4b..b68d4a8 --- a/LearnShell/LinuxCommands/mknod.md +++ b/LearnShell/LinuxCommands/mknod.md @@ -1,6 +1,6 @@ mknod === - + 创建字符设备文件和块设备文件 ## 补充说明 diff --git a/LearnShell/LinuxCommands/mkswap.md b/LearnShell/LinuxCommands/mkswap.md old mode 100644 new mode 100755 index 87cc10d..ef3526a --- a/LearnShell/LinuxCommands/mkswap.md +++ b/LearnShell/LinuxCommands/mkswap.md @@ -1,6 +1,6 @@ mkswap === - + 建立和设置SWAP交换分区 ## 补充说明 diff --git a/LearnShell/LinuxCommands/more.md b/LearnShell/LinuxCommands/more.md old mode 100644 new mode 100755 index bf6547d..85c1fcd --- a/LearnShell/LinuxCommands/more.md +++ b/LearnShell/LinuxCommands/more.md @@ -1,6 +1,6 @@ more === - + 显示文件内容,每次显示一屏 ## 补充说明 diff --git a/LearnShell/LinuxCommands/mount.md b/LearnShell/LinuxCommands/mount.md old mode 100644 new mode 100755 index 616557c..6011221 --- a/LearnShell/LinuxCommands/mount.md +++ b/LearnShell/LinuxCommands/mount.md @@ -66,7 +66,14 @@ mount [-fnrsvw] [-t vfstype] [-o options] device dir #mount -o loop /tmp/image.iso /mnt/cdrom ``` - - +```sh +挂载光驱: +mount /dev/cdrom /mnt/cdrom 格式:Mount 设备名字 挂载点 +df -h +cd /mnt/cdrom +ls /mnt/cdrom +卸载光驱: +umount /mnt/cdrom (注意卸载时不要在当前/mnt/cdrom目录中,不然会提示设备忙的错误信息) +``` diff --git a/LearnShell/LinuxCommands/mv.md b/LearnShell/LinuxCommands/mv.md old mode 100644 new mode 100755 index fb7b773..ed7836f --- a/LearnShell/LinuxCommands/mv.md +++ b/LearnShell/LinuxCommands/mv.md @@ -1,6 +1,6 @@ mv === - + 用来对文件或目录重新命名 ## 补充说明 @@ -17,20 +17,40 @@ mv命令可以用来将源文件移至一个目标文件中,或将一组文件 ### 语法 ``` -mv(选项)(参数) +用法:mv [选项]... [-T] 源文件 目标文件 + 或:mv [选项]... 源文件... 目录 + 或:mv [选项]... -t 目录 源文件... ``` ### 选项 ``` ---backup=<备份模式>:若需覆盖文件,则覆盖前先行备份; --b:当文件存在时,覆盖前,为其创建一个备份; --f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录; --i:交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖。 ---strip-trailing-slashes:删除源文件中的斜杠“/”; --S<后缀>:为备份文件指定后缀,而不使用默认的后缀; ---target-directory=<目录>:指定源文件要移动到目标目录; --u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。 +必选参数对长短选项同时适用。 + --backup[=CONTROL] 为每个已存在的目标文件创建备份 + -b 类似--backup 但不接受参数,当文件存在时,覆盖前,为其创建一个备份 + -f, --force 覆盖前不询问 + -i, --interactive 覆盖前询问 + -n, --no-clobber 不覆盖已存在文件 +如果您指定了-i、-f、-n 中的多个,仅最后一个生效。 + --strip-trailing-slashes 去掉每个源文件参数尾部的斜线 + -S, --suffix=SUFFIX 替换常用的备份文件后缀 + -t, --target-directory=DIRECTORY 移动所有源文件参数到目录 + -T, --no-target-directory treat DEST as a normal file + -u, --update 当源文件比目标文件新或者目标文件不存在时,才执行移动操作 + -v, --verbose explain what is being done + -Z, --context set SELinux security context of destination + file to default type + --help 显示此帮助信息并退出 + --version 显示版本信息并退出 + +The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. +The version control method may be selected via the --backup option or through +the VERSION_CONTROL environment variable. Here are the values: + + none, off 不进行备份(即使使用了--backup 选项) + numbered, t 备份文件加上数字进行排序 + existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份 + simple, never 永远使用普通方式备份 ``` ### 参数 @@ -40,77 +60,17 @@ mv(选项)(参数) ### 实例 -将目录`/usr/men`中的所有文件移到当前目录(用`.`表示)中: - -``` -mv /usr/men/* . -``` - -移动文件 - -``` -mv file_1.txt /home/office/ -``` - -移动多个文件 - -``` -mv file_2.txt file_3.txt file_4.txt /home/office/ -mv *.txt /home/office/ -``` - -移动目录 - -``` -mv directory_1/ /home/office/ -``` - -重命名文件或目录 - -```bash -mv file_1.txt file_2.txt # 将文件file_1.txt改名为file_2.txt -``` - -重命名目录 +将文件ex3改名为new1 ``` -mv directory_1/ directory_2/ -``` - -打印移动信息 - -```bash -mv -v *.txt /home/office +mv ex3 new1 ``` -提示是否覆盖文件 - -``` -mv -i file_1.txt /home/office -``` - -源文件比目标文件新时才执行更新 - -``` -mv -uv *.txt /home/office -``` - -不要覆盖任何已存在的文件 - -``` -mv -vn *.txt /home/office -``` - -复制时创建备份 +将目录`/usr/men`中的所有文件移到当前目录(用`.`表示)中: ``` -mv -bv *.txt /home/office +mv /usr/men/* . ``` -无条件覆盖已经存在的文件 - -``` -mv -f *.txt /home/office -``` diff --git a/LearnShell/LinuxCommands/nano.md b/LearnShell/LinuxCommands/nano.md old mode 100644 new mode 100755 index cbe58bb..b0237ff --- a/LearnShell/LinuxCommands/nano.md +++ b/LearnShell/LinuxCommands/nano.md @@ -1,6 +1,6 @@ nano === - + 字符终端文本编辑器 ## 补充说明 diff --git a/LearnShell/LinuxCommands/netstat.md b/LearnShell/LinuxCommands/netstat.md old mode 100644 new mode 100755 index 407a018..fb84972 --- a/LearnShell/LinuxCommands/netstat.md +++ b/LearnShell/LinuxCommands/netstat.md @@ -1,4 +1,5 @@ -netstat +# netstat + === 查看Linux中网络系统状态信息 @@ -7,15 +8,15 @@ netstat **netstat命令** 用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。 -### 语法 +### 语法 -``` +```sh netstat(选项) ``` -### 选项 +### 选项 -``` +```sh -a或--all:显示所有连线中的Socket; -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址; -c或--continuous:持续列出网络状态; @@ -40,130 +41,326 @@ netstat(选项) -w或--raw:显示RAW传输协议的连线状况; -x或--unix:此参数的效果和指定"-A unix"参数相同; --ip或--inet:此参数的效果和指定"-A inet"参数相同。 -``` -### 实例 +usage: netstat [-vWeenNcCF] [] -r netstat {-V|--version|-h|--help} + netstat [-vWnNcaeol] [ ...] + netstat { [-vWeenNac] -I[] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay] + + -r, --route display routing table + -I, --interfaces= display interface table for + -i, --interfaces display interface table + -g, --groups display multicast group memberships + -s, --statistics display networking statistics (like SNMP) + -M, --masquerade display masqueraded connections + + -v, --verbose be verbose + -W, --wide don't truncate IP addresses + -n, --numeric don't resolve names + --numeric-hosts don't resolve host names + --numeric-ports don't resolve port names + --numeric-users don't resolve user names + -N, --symbolic resolve hardware names + -e, --extend display other/more information + -p, --programs display PID/Program name for sockets + -o, --timers display timers + -c, --continuous continuous listing + + -l, --listening display listening server sockets + -a, --all display all sockets (default: connected) + -F, --fib display Forwarding Information Base (default) + -C, --cache display routing cache instead of FIB + -Z, --context display SELinux security context for sockets + - **列出所有端口 (包括监听和未监听的)** ``` + +### 实例 + +#### 列出所有端口 (包括监听和未监听的) + +```sh netstat -a #列出所有端口 netstat -at #列出所有tcp端口 -netstat -au #列出所有udp端口 +netstat -au #列出所有udp端口 +netstat -ng #查看组播情况 ``` - **列出所有处于监听状态的 Sockets** +#### 列出所有处于监听状态的 Sockets -``` +```sh netstat -l #只显示监听端口 netstat -lt #只列出所有监听 tcp 端口 netstat -lu #只列出所有监听 udp 端口 netstat -lx #只列出所有监听 UNIX 端口 ``` - **显示每个协议的统计信息** +#### 显示每个协议的统计信息 -``` +```sh netstat -s 显示所有端口的统计信息 netstat -st 显示TCP端口的统计信息 netstat -su 显示UDP端口的统计信息 ``` - **在netstat输出中显示 PID 和进程名称** +#### 在netstat输出中显示 PID 和进程名称 -``` +```sh netstat -pt ``` `netstat -p`可以与其它开关一起使用,就可以添加“PID/进程名称”到netstat输出中,这样debugging的时候可以很方便的发现特定端口运行的程序。 - **在netstat输出中不显示主机,端口和用户名(host, port or user)** +#### 在netstat输出中不显示主机,端口和用户名(host, port or user) 当你不想让主机,端口和用户名显示,使用`netstat -n`。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询。 -``` +```sh netstat -an ``` 如果只是不想让这三个名称中的一个被显示,使用以下命令: -``` +```sh netsat -a --numeric-ports netsat -a --numeric-hosts netsat -a --numeric-users ``` - **持续输出netstat信息** +#### 持续输出netstat信息 -``` +```sh netstat -c #每隔一秒输出网络信息 ``` - **显示系统不支持的地址族(Address Families)** +#### 显示系统不支持的地址族(Address Families) -``` +```sh netstat --verbose ``` 在输出的末尾,会有如下的信息: -``` +```sh netstat: no support for `AF IPX' on this system. netstat: no support for `AF AX25' on this system. netstat: no support for `AF X25' on this system. netstat: no support for `AF NETROM' on this system. ``` - **显示核心路由信息** +#### 显示核心路由信息 -``` +```sh netstat -r ``` 使用`netstat -rn`显示数字格式,不查询主机名称。 - **找出程序运行的端口** +#### 找出程序运行的端口 并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。 -``` +```sh netstat -ap | grep ssh ``` 找出运行在指定端口的进程: -``` +```sh netstat -an | grep ':80' ``` - **显示网络接口列表** +#### 显示网络接口列表 -``` +```sh netstat -i ``` 显示详细信息,像是ifconfig使用`netstat -ie`。 - **IP和TCP分析** +#### IP和TCP分析 查看连接某服务端口最多的的IP地址: -``` +```sh netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}' | sort -nr ``` TCP各种状态列表: -``` +```sh netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}' ``` 查看phpcgi进程数,如果接近预设值,说明不够用,需要增加: -``` +```sh netstat -anpo | grep "php-cgi" | wc -l ``` +获取连接数的命令 + +```sh +netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' + +``` + +| 命令拆分 | 详解 | +| ----- | ---- | +| /^tcp/ | 过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。 | +| S[] | 定义了一个名叫S的数组,在awk中,数组下标通常从 1 开始,而不是 0。 | +| NF | 当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于6 | +| $NF | 表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。 | +| S[$NF] | 表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数 | +| ++S[$NF] | 表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一 | +| END | 结束 | +| forkey in S | 遍历S[]数组 | +| print key,”\t”,S[key] | 打印数组的键和值,中间用\t制表符分割,显示好一些。 | + +统计服务器当前单IP连接数最大的IP地址前十 + +```sh +netstat -an|awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}'|sort -rn -k2 + +netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2 +``` + +tcp连接状态的描述说明(netstat输出) + +```sh +Active Internet connections (w/o servers) + +Proto Recv-Q Send-Q Local AddressForeign AddressState + +Proto + +The protocol (tcp, udp, raw) used by the socket. + +第一列为socket使用的协议。 + +Recv-Q + +The count of bytes not copied by the user program connected to this socket. + +第二列为接到的但是还没处理的字节数。 + +Send-Q + +The count of bytes not acknowledged by the remote host. + +第三列为已经发送的但是没有被远程主机确认收到的字节数。 + +Local Address + +Address and port number of the local end of the socket.Unless the --numeric(-n) + +optionisspecified,thesocketaddress is resolved to its canonical host name + +(FQDN), and the port number is translated into the corresponding service name. + +第四列为 本地的地址及端口。 + +Foreign Address + +Address and port number of the remote endofthesocket.Analogousto"Local Address." + +第五列为外部的地址及端口。 + +State + +Thestateofthesocket.Sincethere are no states in raw mode and usually no + +states used in UDP, this column may be left blank. Normally this can be one of sev- + +eral values: + +第六列为socket的状态,通常仅仅有tcp的状态,状态值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,详见下文。其中,最重要的是第六列。 + +``` + +netstat第六列State的状态信息 + +```sh + +State + +Thestateofthesocket.Sincethere are no states in raw mode and usually no + +states used in UDP, this column may be left blank. Normally this can be one of sev- + +eral values: + +第六列为socket的状态,通常仅仅有tcp的状态,状态值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,详见下文。其中,最重要的是第六列。 + +ESTABLISHED + +The socket has an established connection. + +socket已经建立连接,表示处于连接的状态,一般认为有一个ESTABLISHED认为是一个服务的并发连接。这个连接状态在生产场景很重要,要重点关注。 + +SYN_SENT + +The socket is actively attempting to establish a connection. + +socket正在积极尝试建立一个连接,即处于发送后连接前的一个等待但未匹配进入连接的状态。 + +SYN_RECV + +A connection request has been received from the network. + +已经从网络上收到一个连接请求。 + +FIN_WAIT1 - \ No newline at end of file +The socket is closed, and the connection is shutting down. + +socket已关闭,连接正在或正要关闭。 + +FIN_WAIT2 + +Connectionisclosed,andthesocket is waiting for a shutdown from the remote end. + +连接已关闭,并且socket正在等待远端结束。 + +TIME_WAIT + +The socket is waiting after close to handle packets still in the network. + +socket正在等待关闭处理仍在网络上的数据包,这个连接状态在生产场景很重要,要重点关注。 + +CLOSED The socket is not being used.| socket不在被占用了。 + +CLOSE_WAIT + +The remote end has shutdown, waiting for the socket to close. + +远端已经结束,等待socket关闭。 + +LAST_ACK + +The remote end has shut down, and the socket is closed. Waiting for acknowl-edgement.| + +远端已经结束,并且socket也已关闭,等待acknowl-edgement。 + +LISTEN Thesocketislisteningforincoming connections.Such sockets are not + +included in the output unless you specify the --listening (-l) or --all (-a) + +option. + +socket正在监听连接请求。 + +CLOSING + +Both sockets are shut down but we still don’t have all our data sent. + +sockets关闭,但是我们仍旧没有发送数据。 + +UNKNOWN + +The state of the socket is unknown + +未知的状态。 + +``` diff --git a/LearnShell/LinuxCommands/nice.md b/LearnShell/LinuxCommands/nice.md old mode 100644 new mode 100755 index 5e04617..0beb229 --- a/LearnShell/LinuxCommands/nice.md +++ b/LearnShell/LinuxCommands/nice.md @@ -5,18 +5,36 @@ nice ## 补充说明 -**nice命令** 用于以指定的进程调度优先级启动其他的程序。 +**nice命令** 用于以指定的进程调度优先级启动其他的程序。Crontab中用什么命令定义某个程序执行的优先级别 + +nice/renice:进程执行优先级 + +概念: + +进程优先级:系统按进程优先级的不同分配CPU时间,优先级高的进程会得到更多的CPU使用时间,以提高速度,缩短总的执行时间。 + +进程优先级范围:-20至19 + +最高等级:-20 + +最低等级:19 + +系统管理员有权将进程优先级设置为-1至-20,而普通用户只能设置0至19。 + +进程运行的默认等级为0。 + +用nice执行的进程其默认等级为10(即nice <程序名>,不指定等级时)。 ### 语法 ``` -nice(选项)(参数) +nice [选项] [命令 [参数]...] ``` ### 选项 ``` --n:指定进程的优先级(整数)。 +-n:指定进程的优先级(整数,默认是10)。 ``` ### 参数 @@ -37,5 +55,36 @@ nice -19 tar zcf pack.tar.gz documents nice --19 tar zcf pack.tar.gz documents ``` +如:(命令后加&表示以后台运行) + +vi & 优先等级0,默认等级。 + +nice vi & 优先等级10,使用nice执行程序时的默认等级。 + +nice -50 vi & 优先等级19,-号表示选项,等级50超过最低等级19,因此系统以等级19执行。 + +nice -18 vi & 优先等级18。 + +nice --50 vi & 优先等级-20,选项值为-50,超过最高等级-20,因此系统以等级-20执行。 + +nice --18 vi & 优先等级-18。 + +通过ps -l可查看以上命令的执行情况(注意查看各vi进程NI值的不同)。 + +重新调整正在执行的进程的优先级: + +调整指定PID进程的等级 + +renice <等级> + +注意:<等级>是参数,不是选项,没有前缀-号。 + +调整指定用户的所有进程的等级 + +renice <等级> <用户名1> <用户名2> ... + +调整指定组的所有用户的所有进程的等级 + +renice <等级> -g <组名1> \ No newline at end of file diff --git a/LearnShell/LinuxCommands/nl.md b/LearnShell/LinuxCommands/nl.md old mode 100644 new mode 100755 index bc91a50..4f7d827 --- a/LearnShell/LinuxCommands/nl.md +++ b/LearnShell/LinuxCommands/nl.md @@ -1,6 +1,6 @@ nl === - + 在Linux系统中计算文件内容行号 ## 补充说明 diff --git a/LearnShell/LinuxCommands/nmap.md b/LearnShell/LinuxCommands/nmap.md old mode 100644 new mode 100755 index 36dd811..bb558a6 --- a/LearnShell/LinuxCommands/nmap.md +++ b/LearnShell/LinuxCommands/nmap.md @@ -1,6 +1,6 @@ nmap === - + 网络探测和安全审核 ## 补充说明 diff --git a/LearnShell/LinuxCommands/nmcli.md b/LearnShell/LinuxCommands/nmcli.md old mode 100644 new mode 100755 diff --git a/LearnShell/LinuxCommands/nslookup.md b/LearnShell/LinuxCommands/nslookup.md old mode 100644 new mode 100755 index 212185a..7e5e911 --- a/LearnShell/LinuxCommands/nslookup.md +++ b/LearnShell/LinuxCommands/nslookup.md @@ -1,6 +1,6 @@ nslookup === - + 查询域名DNS信息的工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ntpdate.md b/LearnShell/LinuxCommands/ntpdate.md old mode 100644 new mode 100755 index f8f9fe4..aeffc69 --- a/LearnShell/LinuxCommands/ntpdate.md +++ b/LearnShell/LinuxCommands/ntpdate.md @@ -1,6 +1,6 @@ ntpdate === - + 使用网络计时协议(NTP)设置日期和时间 ## 补充说明 diff --git a/LearnShell/LinuxCommands/openssl.md b/LearnShell/LinuxCommands/openssl.md old mode 100644 new mode 100755 index 4fb84e2..4ca916f --- a/LearnShell/LinuxCommands/openssl.md +++ b/LearnShell/LinuxCommands/openssl.md @@ -1,6 +1,6 @@ openssl === - + 强大的安全套接字层密码库 ## 补充说明 @@ -69,7 +69,7 @@ OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1 # openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt ``` -用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。 +# 用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。 ``` # openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt @@ -210,4 +210,4 @@ cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包 ``` - + \ No newline at end of file diff --git a/LearnShell/LinuxCommands/parted.md b/LearnShell/LinuxCommands/parted.md old mode 100644 new mode 100755 index fad6efe..5bab7e8 --- a/LearnShell/LinuxCommands/parted.md +++ b/LearnShell/LinuxCommands/parted.md @@ -1,6 +1,6 @@ parted === - + 磁盘分区和分区大小调整工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/passwd.md b/LearnShell/LinuxCommands/passwd.md old mode 100644 new mode 100755 index 72b30ba..a51262d --- a/LearnShell/LinuxCommands/passwd.md +++ b/LearnShell/LinuxCommands/passwd.md @@ -1,6 +1,6 @@ passwd === - + 用于让用户可以更改自己的密码 ## 补充说明 @@ -16,14 +16,23 @@ passwd(选项)(参数) ### 选项 ``` --d:删除密码,仅有系统管理者才能使用; --f:强制执行; --k:设置只有在密码过期失效后,方能更新; --l:锁住密码; --s:列出密码的相关信息,仅有系统管理者才能使用; --u:解开已上锁的帐号。 -``` - +选项: +-a, --all 报告所有帐户的密码状态 +-d, --delete 删除指定帐户的密码 +-e, --expire 强制使指定帐户的密码过期 +-h, --help 显示此帮助信息并推出 +-k, --keep-tokens 仅在过期后修改密码 +-i, --inactive INACTIVE 密码过期后设置密码不活动为 INACTIVE +-l, --lock 锁定指定的帐户 +-n, --mindays MIN_DAYS 设置到下次修改密码所须等待的最短天数 +为 MIN_DAYS +-q, --quiet 安静模式 +-r, --repository REPOSITORY 在 REPOSITORY 库中改变密码 +-R, --root CHROOT_DIR chroot 到的目录 +-S, --status 报告指定帐户密码的状态 +-u, --unlock 解锁被指定帐户 +-w, --warndays WARN_DAYS 设置过期警告天数为 WARN_DAYS +-x, --maxdays MAX_DAYS 设置到下次修改密码所须等待的最多的天数为 MAX_DAYS ### 参数 用户名:需要设置密码的用户名。 @@ -125,4 +134,4 @@ Empty password. //空密码,也就是没有密码; 注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。 - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/patch.md b/LearnShell/LinuxCommands/patch.md old mode 100644 new mode 100755 index a1d71ec..2692a2a --- a/LearnShell/LinuxCommands/patch.md +++ b/LearnShell/LinuxCommands/patch.md @@ -1,6 +1,6 @@ patch === - + 为开放源代码软件安装补丁程序 ## 补充说明 diff --git a/LearnShell/LinuxCommands/pidof.md b/LearnShell/LinuxCommands/pidof.md old mode 100644 new mode 100755 index ea466b2..68f1b52 --- a/LearnShell/LinuxCommands/pidof.md +++ b/LearnShell/LinuxCommands/pidof.md @@ -1,6 +1,6 @@ pidof === - + 查找指定名称的进程的进程号ID号 ## 补充说明 diff --git a/LearnShell/LinuxCommands/ping.md b/LearnShell/LinuxCommands/ping.md old mode 100644 new mode 100755 index cebd15e..8e6abf6 --- a/LearnShell/LinuxCommands/ping.md +++ b/LearnShell/LinuxCommands/ping.md @@ -1,6 +1,6 @@ ping === - + 测试主机之间网络的连通性 ## 补充说明 diff --git a/LearnShell/LinuxCommands/poweroff.md b/LearnShell/LinuxCommands/poweroff.md old mode 100644 new mode 100755 diff --git a/LearnShell/LinuxCommands/ps.md b/LearnShell/LinuxCommands/ps.md old mode 100644 new mode 100755 index 3111ace..7b818d2 --- a/LearnShell/LinuxCommands/ps.md +++ b/LearnShell/LinuxCommands/ps.md @@ -1,99 +1,108 @@ -ps -=== - -报告当前系统的进程状态 - -## 补充说明 - -**ps命令** 用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。 - -### 语法 - -``` -ps(选项) -``` - -### 选项 - -``` --a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 -a:显示现行终端机下的所有程序,包括其他用户的程序。 --A:显示所有程序。 --c:显示CLS和PRI栏位。 -c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。 --C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。 --d:显示所有程序,但不包括阶段作业领导者的程序。 --e:此选项的效果和指定"A"选项相同。 -e:列出程序时,显示每个程序所使用的环境变量。 --f:显示UID,PPIP,C与STIME栏位。 -f:用ASCII字符显示树状结构,表达程序间的相互关系。 --g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。 -g:显示现行终端机下的所有程序,包括群组领导者的程序。 --G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。 -h:不显示标题列。 --H:显示树状结构,表示程序间的相互关系。 --j或j:采用工作控制的格式显示程序状况。 --l或l:采用详细的格式来显示程序状况。 -L:列出栏位的相关信息。 --m或m:显示所有的执行绪。 -n:以数字来表示USER和WCHAN栏位。 --N:显示所有的程序,除了执行ps指令终端机下的程序之外。 --p<程序识别码>:指定程序识别码,并列出该程序的状况。 -p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。 -r:只列出现行终端机正在执行中的程序。 --s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。 -s:采用程序信号的格式显示程序状况。 -S:列出程序时,包括已中断的子程序资料。 --t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。 -t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。 --T:显示现行终端机下的所有程序。 --u<用户识别码>:此选项的效果和指定"-U"选项相同。 -u:以用户为主的格式来显示程序状况。 --U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。 -U<用户名称>:列出属于该用户的程序的状况。 -v:采用虚拟内存的格式显示程序状况。 --V或V:显示版本信息。 --w或w:采用宽阔的格式来显示程序状况。  -x:显示所有程序,不以终端机来区分。 -X:采用旧式的Linux i386登陆格式显示程序状况。 --y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。 --<程序识别码>:此选项的效果和指定"p"选项相同。 ---cols<每列字符数>:设置每列的最大字符数。 ---columns<每列字符数>:此选项的效果和指定"--cols"选项相同。 ---cumulative:此选项的效果和指定"S"选项相同。 ---deselect:此选项的效果和指定"-N"选项相同。 ---forest:此选项的效果和指定"f"选项相同。 ---headers:重复显示标题列。 ---help:在线帮助。 ---info:显示排错信息。 ---lines<显示列数>:设置显示画面的列数。 ---no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。 ---group<群组名称>:此选项的效果和指定"-G"选项相同。 ---Group<群组识别码>:此选项的效果和指定"-G"选项相同。 ---pid<程序识别码>:此选项的效果和指定"-p"选项相同。 ---rows<显示列数>:此选项的效果和指定"--lines"选项相同。 ---sid<阶段作业>:此选项的效果和指定"-s"选项相同。 ---tty<终端机编号>:此选项的效果和指定"-t"选项相同。 ---user<用户名称>:此选项的效果和指定"-U"选项相同。 ---User<用户识别码>:此选项的效果和指定"-U"选项相同。 ---version:此选项的效果和指定"-V"选项相同。 ---widty<每列字符数>:此选项的效果和指定"-cols"选项相同。 -``` - -由于ps命令能够支持的系统类型相当的多,所以选项多的离谱! - -### 实例 - -按内存资源的使用量对进程进行排序 - -``` -ps aux | sort -rnk 4 -``` - -按 CPU 资源的使用量对进程进行排序 - -``` -ps aux | sort -nk 3 -``` - - +ps +=== + +报告当前系统的进程状态 + +## 补充说明 + +**ps命令** 用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。 + +### 语法 + +``` +ps(选项) +``` + +### 选项 + +``` +-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 +a:显示现行终端机下的所有程序,包括其他用户的程序。 +-A:显示所有程序。 +-c:显示CLS和PRI栏位。 +c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。 +-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。 +-d:显示所有程序,但不包括阶段作业领导者的程序。 +-e:此选项的效果和指定"A"选项相同。 +e:列出程序时,显示每个程序所使用的环境变量。 +-f:显示UID,PPIP,C与STIME栏位。 +f:用ASCII字符显示树状结构,表达程序间的相互关系。 +-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。 +g:显示现行终端机下的所有程序,包括群组领导者的程序。 +-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。 +h:不显示标题列。 +-H:显示树状结构,表示程序间的相互关系。 +-j或j:采用工作控制的格式显示程序状况。 +-l或l:采用详细的格式来显示程序状况。 +L:列出栏位的相关信息。 +-m或m:显示所有的执行绪。 +n:以数字来表示USER和WCHAN栏位。 +-N:显示所有的程序,除了执行ps指令终端机下的程序之外。 +-p<程序识别码>:指定程序识别码,并列出该程序的状况。 +p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。 +r:只列出现行终端机正在执行中的程序。 +-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。 +s:采用程序信号的格式显示程序状况。 +S:列出程序时,包括已中断的子程序资料。 +-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。 +t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。 +-T:显示现行终端机下的所有程序。 +-u<用户识别码>:此选项的效果和指定"-U"选项相同。 +u:以用户为主的格式来显示程序状况。 +-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。 +U<用户名称>:列出属于该用户的程序的状况。 +v:采用虚拟内存的格式显示程序状况。 +-V或V:显示版本信息。 +-w或w:采用宽阔的格式来显示程序状况。  +x:显示所有程序,不以终端机来区分。 +X:采用旧式的Linux i386登陆格式显示程序状况。 +-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。 +-<程序识别码>:此选项的效果和指定"p"选项相同。 +--cols<每列字符数>:设置每列的最大字符数。 +--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。 +--cumulative:此选项的效果和指定"S"选项相同。 +--deselect:此选项的效果和指定"-N"选项相同。 +--forest:此选项的效果和指定"f"选项相同。 +--headers:重复显示标题列。 +--help:在线帮助。 +--info:显示排错信息。 +--lines<显示列数>:设置显示画面的列数。 +--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。 +--group<群组名称>:此选项的效果和指定"-G"选项相同。 +--Group<群组识别码>:此选项的效果和指定"-G"选项相同。 +--pid<程序识别码>:此选项的效果和指定"-p"选项相同。 +--rows<显示列数>:此选项的效果和指定"--lines"选项相同。 +--sid<阶段作业>:此选项的效果和指定"-s"选项相同。 +--tty<终端机编号>:此选项的效果和指定"-t"选项相同。 +--user<用户名称>:此选项的效果和指定"-U"选项相同。 +--User<用户识别码>:此选项的效果和指定"-U"选项相同。 +--version:此选项的效果和指定"-V"选项相同。 +--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。 +``` + +由于ps命令能够支持的系统类型相当的多,所以选项多的离谱! + +### 实例 + +按内存资源的使用量对进程进行排序 + +```sh +ps aux | sort -rnk 4 +``` + +按 CPU 资源的使用量对进程进行排序 + +```sh +ps aux | sort -nk 3 +``` + +最常用的查询指令; + +```sh +ps -le or ps -aux 查看所有用户执行的进程的详细信息; +ps -aux --sort pid 可按照进程执行的时间,PID,UID等对进程进行排序; +ps -uU tangsir / ps -aux | grep tangsir查看系统中指定用户执行的进程; +pstree | more 进程树,非常直观的观察父子进程; +``` + + diff --git a/LearnShell/LinuxCommands/pstree.md b/LearnShell/LinuxCommands/pstree.md old mode 100644 new mode 100755 index 9192d27..b550871 --- a/LearnShell/LinuxCommands/pstree.md +++ b/LearnShell/LinuxCommands/pstree.md @@ -1,58 +1,58 @@ -pstree -=== - -以树状图的方式展现进程之间的派生关系 - -## 补充说明 - -**pstree命令** 以树状图的方式展现进程之间的派生关系,显示效果比较直观。 - -### 语法 - -``` -pstree(选项) -``` - -### 选项 - -``` --a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示; --c:不使用精简标示法; --G:使用VT100终端机的列绘图字符; --h:列出树状图时,特别标明现在执行的程序; --H<程序识别码>:此参数的效果和指定"-h"参数类似,但特别标明指定的程序; --l:采用长列格式显示树状图; --n:用程序识别码排序。预设是以程序名称来排序; --p:显示程序识别码; --u:显示用户名称; --U:使用UTF-8列绘图字符; --V:显示版本信息。 -``` - -### 实例 - -显示当前所有进程的进程号和进程id - -``` -pstree -p -``` - -显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。 - -```bash -pstree -a -``` - -获取 SSH 会话的 PID - -``` -pstree -p | grep ssh - -# |-sshd(1221)-+-sshd(2768)---bash(2770)-+-grep(2810) -# | `-sshd(2807)---sshd(2808) -``` - -从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 sshd(1221),另两个分支分别为 sshd(2768) 和 sshd(2807)。 - - - +pstree +=== + +以树状图的方式展现进程之间的派生关系 + +## 补充说明 + +**pstree命令** 以树状图的方式展现进程之间的派生关系,显示效果比较直观。 + +### 语法 + +``` +pstree(选项) +``` + +### 选项 + +``` +-a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示; +-c:不使用精简标示法; +-G:使用VT100终端机的列绘图字符; +-h:列出树状图时,特别标明现在执行的程序; +-H<程序识别码>:此参数的效果和指定"-h"参数类似,但特别标明指定的程序; +-l:采用长列格式显示树状图; +-n:用程序识别码排序。预设是以程序名称来排序; +-p:显示程序识别码; +-u:显示用户名称; +-U:使用UTF-8列绘图字符; +-V:显示版本信息。 +``` + +### 实例 + +显示当前所有进程的进程号和进程id + +``` +pstree -p +``` + +显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。 + +```bash +pstree -a +``` + +获取 SSH 会话的 PID + +``` +pstree -p | grep ssh + +# |-sshd(1221)-+-sshd(2768)---bash(2770)-+-grep(2810) +# | `-sshd(2807)---sshd(2808) +``` + +从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 sshd(1221),另两个分支分别为 sshd(2768) 和 sshd(2807)。 + + + diff --git a/LearnShell/LinuxCommands/pwd.md b/LearnShell/LinuxCommands/pwd.md old mode 100644 new mode 100755 index 1ec2f46..a2baab5 --- a/LearnShell/LinuxCommands/pwd.md +++ b/LearnShell/LinuxCommands/pwd.md @@ -1,6 +1,6 @@ pwd === - + 绝对路径方式显示用户当前工作目录 ## 补充说明 diff --git a/LearnShell/LinuxCommands/reboot.md b/LearnShell/LinuxCommands/reboot.md old mode 100644 new mode 100755 index e235a2a..6634f36 --- a/LearnShell/LinuxCommands/reboot.md +++ b/LearnShell/LinuxCommands/reboot.md @@ -1,6 +1,6 @@ reboot === - + 重新启动正在运行的Linux操作系统 ## 补充说明 diff --git a/LearnShell/LinuxCommands/renamemd.sh b/LearnShell/LinuxCommands/renamemd.sh new file mode 100755 index 0000000..7ffaab1 --- /dev/null +++ b/LearnShell/LinuxCommands/renamemd.sh @@ -0,0 +1,9 @@ +#!/bin/bash +for file in *.md; +do + mv -i "${file}" "${file/md/txt}" +done + +#原理: +#${var/Pattern/Replacement} +#Pattern第一个匹配项,在var中替换为replacement diff --git a/LearnShell/LinuxCommands/renice.md b/LearnShell/LinuxCommands/renice.md old mode 100644 new mode 100755 index c0264c9..4d2aa94 --- a/LearnShell/LinuxCommands/renice.md +++ b/LearnShell/LinuxCommands/renice.md @@ -1,6 +1,6 @@ renice === - + 修改正在运行的进程的调度优先级 ## 补充说明 diff --git a/LearnShell/LinuxCommands/rm.md b/LearnShell/LinuxCommands/rm.md old mode 100644 new mode 100755 index 9f59f15..41f9256 --- a/LearnShell/LinuxCommands/rm.md +++ b/LearnShell/LinuxCommands/rm.md @@ -1,6 +1,6 @@ rm === - + 用于删除给定的文件和目录 ## 补充说明 @@ -12,18 +12,40 @@ rm ### 语法 ``` -rm (选项)(参数) +rm (选项)(文件) ``` ### 选项 ``` --d:直接把欲删除的目录的硬连接数据删除成0,删除该目录; --f:强制删除文件或目录; --i:删除已有文件或目录之前先询问用户; --r或-R:递归处理,将指定目录下的所有文件与子目录一并处理; ---preserve-root:不对根目录进行递归操作; --v:显示指令的详细执行过程。 + -f, --force 忽略不存在的文件和参数,不提示直接强制删除 + -i 删除已有文件或目录之前先询问用户 + -I prompt once before removing more than three files, or + when removing recursively; less intrusive than -i, + while still giving protection against most mistakes + --interactive[=WHEN] prompt according to WHEN: never, once (-I), or + always (-i); without WHEN, prompt always + --one-file-system 递归删除一个层级时,跳过所有不符合命令行参 + 数的文件系统上的文件 + --no-preserve-root do not treat '/' specially + --preserve-root do not remove '/' (default) + -r, -R, --recursive remove directories and their contents recursively + -d, --dir 移除空目录 + -v, --verbose 显示指令的详细执行过程 + --help 显示此帮助信息并退出 + --version 显示版本信息并退出 + +默认时,rm 不会删除目录。使用--recursive(-r 或-R)选项可删除每个给定 +的目录,以及其下所有的内容。 + +To remove a file whose name starts with a '-', for example '-foo', +use one of these commands: + rm -- -foo + + rm ./-foo + +请注意,如果使用rm 来删除文件,通常仍可以将该文件恢复原状。如果想保证 +该文件的内容无法还原,请考虑使用shred。 ``` ### 参数 @@ -49,4 +71,4 @@ Remove example ?y(删除文件example) 应注意,这样做是非常危险的! - \ No newline at end of file + diff --git a/LearnShell/LinuxCommands/rpm.md b/LearnShell/LinuxCommands/rpm.md old mode 100644 new mode 100755 index c97548f..312312f --- a/LearnShell/LinuxCommands/rpm.md +++ b/LearnShell/LinuxCommands/rpm.md @@ -1,6 +1,6 @@ rpm === - + RPM软件包的管理工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/rsync.md b/LearnShell/LinuxCommands/rsync.md old mode 100644 new mode 100755 index 130a8e6..2a0da87 --- a/LearnShell/LinuxCommands/rsync.md +++ b/LearnShell/LinuxCommands/rsync.md @@ -1,6 +1,6 @@ rsync === - + 远程数据同步工具 ## 补充说明 diff --git a/LearnShell/LinuxCommands/sed.md b/LearnShell/LinuxCommands/sed.md old mode 100644 new mode 100755 index c5cd240..503028e --- a/LearnShell/LinuxCommands/sed.md +++ b/LearnShell/LinuxCommands/sed.md @@ -1,4 +1,5 @@ -sed +# sed + === 功能强大的流式文本编辑器 @@ -9,16 +10,51 @@ sed ## sed的选项、命令、替换标记 - **命令格式** - -``` -sed [options] 'command' file(s) -sed [options] -f scriptfile file(s) +### 命令格式 + +```sh +用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]... + + -n, --quiet, --silent + 取消自动打印模式空间 + -e 脚本, --expression=脚本 + 添加“脚本”到程序的运行列表 + -f 脚本文件, --file=脚本文件 + 添加“脚本文件”到程序的运行列表 + --follow-symlinks + 直接修改文件时跟随软链接 + -i[SUFFIX], --in-place[=SUFFIX] + edit files in place (makes backup if SUFFIX supplied) + -c, --copy + use copy instead of rename when shuffling files in -i mode + -b, --binary + does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX ( + open files in binary mode (CR+LFs are not treated specially)) + -l N, --line-length=N + 指定“l”命令的换行期望长度 + --posix + 关闭所有 GNU 扩展 + -r, --regexp-extended + 在脚本中使用扩展正则表达式 + -s, --separate + 将输入文件视为各个独立的文件而不是一个长的连续输入 + -u, --unbuffered + 从输入文件读取最少的数据,更频繁的刷新输出 + -z, --null-data + separate lines by NUL characters + --help + display this help and exit + --version + output version information and exit + +如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为 +sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准 +输入读取数据。 ``` ### 选项 -``` +```sh -e