反引号的使用
$ echo `basename \`pwd\`` # 基于反引号的命令替换是可嵌入的,但是嵌入命令的反引号需要使用反斜杠转义root $ d=$(date) #除了反引号可以用于命令替换,这里我们也可以使用$(command)形式用于命令替换$ echo $dTue Mar 10 11:51:33 EET 2015$ dirname="$(basename $(pwd))" #和之前的反引号一样,该方式也支持嵌套。$ echo $dirnameroot
按照PID杀进程
$ who # 查看当前多少个TTYtest1 pts/0 Mar 10 11:58 (192.168.0.1)test2 pts/1 Mar 9 09:49 (192.168.0.1)$ ps -t pts/1 | grep -v PID | awk '{print $1"\t"}' | xargs kill -9 # 杀掉 pts/1连接的进程$ ps -t pts/1 # 或执行who命令查看已经不在了。ERROR: TTY could not be found.
统计当前目录下文件和目录的数量
$ ls -l * | grep "^-" | wc -l # 列出当前目录下所有普通文件, 以-开头4$ ls -l * | grep "^d" | wc -l # 列出当前目录下所有目录文件,以d开头5
查找空文件
# 方法一: $ find . -empty -type f -exec ls -l {} \;# 方法二: $ find . -size 0 | xargs ls -l;
查找文件的新旧
$ find . -newer file1 ! -newer file2 #查找文件更新日期比file1新,但比file2旧的文件./file22./adaptation2./adaptation2_1./file2
实时监控用户登录情况
watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动运行。该命令最为常用的两个选项是-d和-n,其中-n表示间隔多少秒执行一次"command",-d表示高亮发生变化的位置。下面列举几个在watch中常用的实时监视命令:
$watch -d -n 1 ‘who’ # 每隔一秒执行一次who命令,以监视服务器当前用户登录的状况 Every 1.0s: who Sat Nov 12 12:37:18 2011 stephen tty1 2011-11-11 17:38 (:0) stephen pts/0 2011-11-11 17:39 (:0.0) root pts/1 2011-11-12 10:01 (192.168.149.1) root pts/2 2011-11-12 11:41 (192.168.149.1) root pts/3 2011-11-12 12:11 (192.168.149.1) stephen pts/4 2011-11-12 12:22 (:0.0)此时通过其他Linux客户端工具以root的身份登录当前Linux服务器,再观察watch命令的运行变化。 Every 1.0s: who Sat Nov 12 12:41:09 2011 stephen tty1 2011-11-11 17:38 (:0) stephen pts/0 2011-11-11 17:39 (:0.0) root pts/1 2011-11-12 10:01 (192.168.149.1) root pts/2 2011-11-12 11:41 (192.168.149.1) root pts/3 2011-11-12 12:40 (192.168.149.1) stephen pts/4 2011-11-12 12:22 (:0.0) root pts/5 2011-11-12 12:41 (192.168.149.1)最后一行中被高亮的用户为新登录的root用户。此时按CTRL + C可以退出正在执行的watch监控进程。
查看服务器通过SSH连接情况
$ lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1582 root 3u IPv4 11989 0t0 TCP *:ssh (LISTEN) sshd 1582 root 4u IPv6 11991 0t0 TCP *:ssh (LISTEN) sshd 2829 root 3r IPv4 19635 0t0 TCP bogon:ssh->bogon:15264 (ESTABLISHED)
将查找到的文件打包并copy到指定目录
$ (find . -name "*.txt" | xargs tar -cvf test.tar) && cp -f test.tar /home/.#1) 通过find找到当前目录下(包含所有子目录)的所有*.txt文件。#2) tar命令将find找到的结果压缩成test.tar压缩包文件。#3) 如果&&左侧括号内的命令正常完成,则可以执行&&右侧的shell命令了。#4) 将生成后的test.tar文件copy到/home/.目录下。
SHELL脚本开启DEBUG功能
方法一:在脚本Shebang后面加上-x参数
#!/bin/bash -x
执行结果大致如下:
[me@linuxbox me]$./trouble.sh+ number=1+ '[' 1 = 1 ']'+ echo 'Number equals 1'Number equals 1
方法二:在脚本中用set -x命令打开DEBUG功能,再用set +x命令关闭DEBUG功能
#!/bin/bashnumber=1set -xif [ $number = "1" ]; then echo "Number equals 1"else echo "Number does not equal 1"fiset +x
方法三:在命令行中添加-xv参数同样可以达到目的
-r参数的运用
$ scp -r root@host:/home/metadata . # 拷贝整个文件夹data到当前目录下$ rm -rf /tmp/mydir/ # 删除整个文件夹$ grep -rl 'eth0' /etc # 以递归的方式查找
转译\在创建删除文件中运用
$ touch \\ # 创建文件名为\的文件,需要用反斜杠来转译$ ls -lart \\ # 查询文件名为\的文件,需要用反斜杠来转译-rw-r--r-- 1 omc sysop 0 Mar 11 06:06 \$ rm -rf \\ # 删除文件名为\的文件,需要用反斜杠来转译
CTRL+R组合键运用
Ctrl +R #组合键使用,可以查找历史输入的命令,有的命令很长,就不需要重新输入(reverse-i-search)`':当然也可以用history来实现history 1012 cat language!1012
grep 在统计中简单运用
$ cat languageA Perl PythonB PerlC PythonD PerlE PerlF PythonG Perl PythonI Perl PythonH PythonJ PerlK PythonLM PythonN$ egrep -c "Perl|Python" language # 统计懂Perl或Python的12$ grep "Python" language | grep -c "Perl" #统计即懂Perl又懂Python的3
利用ls -lrSR命令的输出信息
参数解释如下:-l 使用较长格式列出信息-r, --reverse 依相反次序排列-R, --recursive 同时列出所有子目录层-S 根据文件大小排序一般使用下面的命令列出$ ls -lart$ ll
利用^$(开始和结束符)来匹配所有空行
cat clock_file.sh | egrep -v "^#" # 除掉所有注释的,以 #为开头的.grep -n '^$' myfile # 打印空行行号grep -v '^$' myfile # 排除空行
||在脚本中巧妙使用
#拷贝大文件,如果出错,执行||后面的,并将错误信息发送邮件给root,再离开cp from_file to_file || (echo "CP Failed..." | mail root; exit)
grep结合>>使用,保存屏幕信息
$ ls -l | grep ^d >> dir.list # 将目录列表写入一个文件$ more dir.listdrwxr-xr-x 3 root root 4096 Sep 15 09:11 adrwxr-xr-x 3 root root 4096 Aug 20 10:12 subdir
-v参数在grep中的运用
$ ps -ef | grep sleep # 包含了grep本身的进程root 10667 30864 0 10:38 pts/1 00:00:00 sleep 1000root 12406 30864 0 10:39 pts/1 00:00:00 grep sleep$ ps -ef | grep sleep | grep -v grep # 去除了grep本身的进程root 10667 30864 0 10:38 pts/1 00:00:00 sleep 1000
du和sort命令在查询磁盘空间中的运用
$ du -s /usr/* | sort -nr # 以数值的方式倒排后输出/usr的子目录所占用的磁盘空间 1443980 /usr/share 793260 /usr/lib 217584 /usr/bin 128624 /usr/include 60748 /usr/libexec 45148 /usr/src 21096 /usr/sbin 6896 /usr/local 4 /usr/games 4 /usr/etc 0 /usr/tmp
find命令小技巧
find ~root ! -user root # 查找某目录的文件属主,系统安全方面的检查find -perm -7 -exec chmod o-x {} \; # 查找所有用户权限具备读,写,执行权限,然后移除other的执行权限
find命令复杂点运用
# 总的命令 $ find ./ -name "*.output" -print | sed -e 's/.\///g' -e 's/20110311\(.*\)/mv & 20110310\1/g' | bash # 分拆解释 #1) find命令找到文件名扩展名为.output的文件。#2) sed命令中的-e选项表示流编辑动作有多次,第一次是将找到的文件名中相对路径前缀部分去掉,如./aa改为aa。# 流编辑的第二部分,是将20110311替换为mv & 20110310,其中&表示s命令的被替换部分,这里即源文件名。 \1表示被替换部分中#的\(.*\)。#3) 此时的输出应为# mv 20110311.output 20110310.output# mv 20110311abc.output 20110310abc.output# 最后将上面的输出作为命令交给bash命令去执行,从而将所有20110311*.output改为20110311*.output# 分拆执行$ find . -name "*.output" | sed -e 's/.\///g'201401_01.output201401_04.output201401_03.output201401_02.output201401_05.output$ find . -name "*.output"./201401_01.output./201401_04.output./201401_03.output./201401_02.output./201401_05.output$ find . -name "*.output" | sed -e 's/.\///g' -e 's/201301\(.*\)/mv & 201401\1/g'201401_01.output201401_04.output201401_03.output201401_02.output201401_05.output$ find . -name "*.output" | sed -e 's/.\///g' -e 's/201301\(.*\)/mv & 201401\1/g' | bash$ ls -lart-rw-r--r-- 1 root root 0 Aug 27 17:37 201401_01.output-rw-r--r-- 1 root root 0 Aug 27 17:37 201401_02.output-rw-r--r-- 1 root root 0 Aug 27 17:37 201401_03.output-rw-r--r-- 1 root root 0 Aug 27 17:37 201401_04.output-rw-r--r-- 1 root root 0 Aug 27 17:38 201401_05.output
dd命令建指定大小文件
$ dd if=/dev/mapper/rootVG-tmp of=testfile bs=500M count=1 # 建一个500M的文件1+0 records in1+0 records out524288000 bytes (524 MB) copied, 4.45233 seconds, 118 MB/s$ dd if=/dev/zero of=bigfile bs=1024k count=1 seek=10000 # 建空文件
对两个文件取交集,并集操作
#1) 取出兩個檔的並集 cat file1 file2 | sort | uniq > file3 #2) 取出兩個檔的交集 cat file1 file2 | sort | uniq -d > file3#3) 刪除交集 cat file1 file2 | sort | uniq -u > file3
求两个日期相差的天数
echo "####Cal the diff between two date, FOCUS ON THE EXPRESS! "day=`expr '(' $(date +"%s" -d "2014-01-01") - $(date +"%s" -d "2019-01-01") ')' / 86400`echo "The difference is:" $day
用lsof恢复删除的文件
可以通过lsof来恢复删除文件。比如说删除了/var/log/messages首先使用lsof来查看当前是否有进程打开/var/log/messages文件,如下:# lsof | grep /var/log/messages syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:# head -n 10 /proc/1283/fd/2 Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart. Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started. Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)从上面的信息可以看出,查看 /proc/8663/fd/2 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:# cat /proc/1283/fd/2 > /var/log/messages对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用.
在时光的激流中,我们总会长大。