Linux实用小技巧汇总

反引号的使用

$  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对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用.

在时光的激流中,我们总会长大。

Linux实用小技巧汇总

相关文章:

你感兴趣的文章:

标签云: