Linux实用小技巧汇总

反引号的使用                                                                                                              

$  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监控进程。

查看服务器通过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/bash
number=1
set -x
if [ $number = "1" ]; then
    echo "Number equals 1"
else
    echo "Number does not equal 1"
fi
set +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 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 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.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.output
dd命令建指定大小文件                                                                                                     
$ 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 (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
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用.



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值