反引号的使用
$ echo `basename \`pwd\`` # 基于反引号的命令替换是可嵌入的,但是嵌入命令的反引号需要使用反斜杠转义 root $ d=$(date) #除了反引号可以用于命令替换,这里我们也可以使用$(command)形式用于命令替换 $ echo $d Tue Mar 10 11:51:33 EET 2015 $ dirname="$(basename $(pwd))" #和之前的反引号一样,该方式也支持嵌套。 $ echo $dirname root按照PID杀进程
$ who # 查看当前多少个TTY test1 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监控进程。
$ 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/bash number=1 set -x if [ $number = "1" ]; then echo "Number equals 1" else echo "Number does not equal 1" fi set +x
-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 !1012grep 在统计中简单运用
$ cat language A Perl Python B Perl C Python D Perl E Perl F Python G Perl Python I Perl Python H Python J Perl K Python L M Python N $ 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.list drwxr-xr-x 3 root root 4096 Sep 15 09:11 a drwxr-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 1000 root 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 1000du和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/tmpfind命令小技巧
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.output 201401_04.output 201401_03.output 201401_02.output 201401_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.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' | 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.outputdd命令建指定大小文件
$ dd if=/dev/mapper/rootVG-tmp of=testfile bs=500M count=1 # 建一个500M的文件 1+0 records in 1+0 records out 524288000 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 ([email protected]) (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 对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用.