《鸟哥的linux私房菜》基本命令笔记

1.以前没注意过的,略写的命令option后面只能空格后加参数,而标准option即可以空格也可以等号后跟着参数,如date命令,date -r filename ;; date --reference filename ;; date --reference=filename 都是正确的。

 

如果文件以 - 开头,很多命令会失效,比如想删除可以这样:rm --  -2012.log

 

 


2.对于目录来说,即使有r,没有X,也不能进入目录。
对于文件来说,x表示这个文件可以被用户执行,但能不能执行成功,当然得看本身里面的内容了。

 

 

 

-bash: /dev/null: Permission denied

 

 

rm /dev/null; mknod -m 666 /dev/null c 1 3

 

 


3.文件种类:
普通文件 -
纯文本ASCII 文件,可以使用cat查看的都算
二进制文件,Linux的可执行文件,举例来说,cat命令本身就是个二进制文件,或者使用cat查看一些二进制文件时是乱码
数据格式的文件,如登录记录的数据,使用cat查看也是乱码,但可以使用last读出

目录 d
连接文件 l  硬连接与软连接
设备文件
块设备 b 如硬盘
字符设备 c 如串行接口的键盘和鼠标

套接字 s
管道 p

 

 

系统中 所有的设备要么是字符特殊文件,要么是块特殊文件。字符特殊文件针对设备是不带缓冲的访问,每次访问长度可变,而块特殊设备对于访问提供缓冲并且以固定长度为单位进行。

 

 

 

4.只要开头不是/ 就是相对路径的写法,相对路径是以“当前路径的相对位置”来表示的
 ./表示当前路径
../表示上一层路径
建议在写shell 时使用绝对路径,因为绝对不会出错。

5.根目录下最好不要直接有文件,只有目录,且/etc,/dev,/bin/,/sbin,/lib等5个子目录只能跟在/ 下面,不能独立分区。建议独立的分区如/home,/usr,/var,/tmp等

6.挂载的概念:物理的设备挂到目录树上,如/dev/sda2 挂载到/boot上。 另如将window 分区挂载进来时,一般挂在/media/XXX  ... 光盘呢一般在/mnt/cdrom。

7.目录的相关操作
. 表示当前目录
.. 表示上一层目录
- 表示前一个工作目录
~ 表示“当前用户”所在的家目录
~account 表示account用户的家目录
注意simba的家目录是/home/simba,root的家目录是/root

 

groupadd test 

useradd -g test simba -d /data/simba -s /bin/sh

passwd simba


8.pwd -P  不会以连接文件的数据显示,而是显示正确的完整路径
mkdir -p 可以递归建立目录
mkdir -m  711  test 可以设置属性,否则使用默认属性。
rmdir 只能删除空目录(即目录内不能有其他目录或者文件),即需要一层层地删除,可以加 -p 递归删除上层空目录,如果要将所有目录下的东西都删除,使用 rm -rf test (危险)
cp -a 将文件属性一起复制,且递归复制,相当于 -pdr
cp -u 在目标文件与源文件有差异时才复制,常用于备份。


9.查看文件内容
cat: 从第一行开始显示,-A 显示换行符 $ ,-T 显示tab键(^I),-n 显示行号
tac:从最后一行开始显示
nl:显示的时候,输出行号
more:一页一页地显示文件内容

 

less:与more类似,但可以向前翻页

 

shuf:打乱文件内容顺序

 

tail:只看最后几行
head:只看前面几行
          显示~/.bashrc 的第11到第20行
       head -n 20  | tail -n 10

 

sort -nr file:sort lines of text files

sort -k6nr -k5n file.txt:假设先按第6列数字倒序,在此基础上再按第5列顺序排列

 

od:以二进制方式读取文件内容
more,less可以使用 /字符串 进行查找

 

split -l $line -d $file seq_    将文件 $file 分割成 以 seq_ 为前缀的文件,-d 表示以数字为后缀,如 seq_00 

 

 

touch命令
建立一个空文件
将某个文件日期修改为当前日期(atime和mtime)
atime是访问时间,mtime是修改时间,ctime是状态改变时间(属性与权限)

10.一般用户的umask为0002,第一个数为特殊权限所用,root默认umask为0022
建立文件时默认权限为  (-rw-rw-rw-) &~ (-----w--w-)  ==> -rw-r--r--
建立目录时默认权限为(drwxrwxrwx) &~ (d----w--w-) ==> drwxr-xr-x

11.chattr +i 可以让一个文件不能被删除修改写入等  +a表示只能增加数据,不能被删除。
 lsattr可以查看文件的隐藏属性

12. 查找文件
which -a  执行文件
whereis -bmsu  文件名或者目录名
locate filename

find  path  -option -action
-atime n  在n天之前的“一天之内”访问过的文件
-name filename
-size  +50k    #比50k大的文件
-type  TYPE
-exec command  #处理搜索处理的结果,一定以; 结束
如find / -name simba -exec ls -l {} \  ;

 

不知道全名时可以使用通配符*

find . -name '*.[ch]' | xargs wc -l   统计当前目录下.c .h 文件的代码行数

find . -name '*.[ch]' -exec wc -l {} \; 

find $cgi_dir -name "luascan_cgi_after_rewrite_*" -exec 'cat' {} \; > $merged_file   将目录下所有命中特征的文件的内容输出合并到一个文件

stat cutting_board | grep Modify | awk '{print $2}'  得到目录的修改时间

 

cut :remove sections from each line of files

cut -d '分隔符' -f fields    cut -d ':' -f 3, 5

cut -c 字符范围   cut -c 12-20

ps aux | grep client.py | grep -v 'grep' | cut -c 9-15 | xargs kill -9  # 进程 pid 是 9 ~ 15 字符串

ps -ef | grep client.py | grep -v 'grep' | awk '{print $2 }' | xargs kill -9

 

13. export命令输出环境变量

无论是在系统环境变量追加路径如#export PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
 还是将自定义变量使用export name=simba 进行输出,注销再次登陆后这些路径和变量都将不再存在,即export只对当前登录有效。如果想永久保存路径或者变量应在文件中设置,如
 

系统设置文件 /etc/profile  所有用户都会使用到这个文件
个人设置值 ~/.bash_profile  只在登录时读取一次
个人设置值 ~/.bashrc 每次执行脚本都会读取
上述三个文件读取顺序由上到下,故~/.bashrc 是最终读取的设置值,可将个人设置放于此。


另外不要与/etc/bashrc混淆,这个文件是确定umask的功能。

中间一行 . ~/.bashrc    小数点表示可以将设置文件的内容读进当前的shell环境,使用source也可以实现。

若增加一个用户后,登录前缀提示符类似为 bash-4.1$,可以把 root 的 .bash_profile 和 .bashrc 拷贝到用户家目录下,并 chown 权限为用户。

 

14.命令的执行

执行命令无外乎两种形式,一种以绝对路径给出命令,如./name.pl ,/usr/bin/name.pl;另一种则因为设置了环境变量PATH的路径而可以在任何路径执行命令,这两种情况都需要 文件有 x 权限。当然也可以如 perl name.pl (当前目录下),  此时即告诉系统,要直接以/bin/perl 的功能来执行 name.pl 文件内的命令,此时 name.pl 只需要 r 权限即可。

 

15.系统和文件的编码

查看系统当前编码 locale
查看系统支持的编码 iconv -l
查看文件的编码  file -i  (注意与type不同,查看命令的类型)
如windows文件转到Linux下,如果使用dos2unix之后(一般只是去掉换行^M而已)还会乱码,则可以 iconv -f GBK -t UTF-8 file1 -o file2

出现乱码时解决思路:


系统设置的编码格式
文件创建时的编码格式
编辑器打开时使用的编码格式
终端包括连接的如putty的编码格式

 

16.特殊权限介绍

 

 

特殊权限介绍

 

名称

SUID

SGID

  SBIT(粘滞位)

全称

set user id

set groud id

  sticky bit

 功能简述

以文件属主用户身份运行

 获得文件属组权限

对于目录而言,这一位可以理解为防止删除里面的文件和目录

 

 

chmod 4551 filename // 权限: r-sr-x--x    放在数字第一位
chmod 2551 filename // 权限: r-xr-s--x
chmod 1551 filename // 权限: r-xr-x--t
如果本来在x位上已经设置了x的时候,设置这些位将会显示小写的(s,s,t),否则会显示为大写的(S,S,T)。这三位如果转化为8进制表示的话,分别对应的是4(SUID),2(SGID),1(sticky bit)。

 

 

17.find 常用表达式

find命令的主要作用是对树形目录层次结构进行彻底检查。
find命令的一般格式:
    find pathname -expressions

 

-mount

选项表达式,用来防止find命令的搜索范围超出当前文件系统的边界。返回值常为真。

-group grp

条件表达式,检查当前的文件是否具有与grp相同的GID或组名。如果两者一致,返回真值,否则返回假值。

-name pattern

条件表达式,检查文件名是否和模式pattern相同。pattern可以用正则表达式给出。必要时使用引号。当文件名与pattern一致时.返回真值.否则为假。

-type t

条件表达式,检查当前文件的类型是否是t。对目录讲,t值可以是d。对普通文件讲,t值可以是f,对连接讲,t值可以是l 等等。如果当前的文件的类型是t,返回真值,否则为假。

-user usr

条件表达式,检查当前的文件的所有者或UID是否是usr。如果两者一致,返回真值,否则为假。

-exec cmd

操作表达式,用来执行cmd命令。如果要将当前的文件名传送给命令,应该加{}标记,分号用来表示cmd的结束,并和后面可能出现的表达式分开。如果成功地执行了cmd命令,返回真值,否则为假。

-print

操作表达式,将当前的文件名送到标准输出设备显示,返回值常为真。

 

 

 

find .  -name ‘abc*’-print
find .  -user root -print
find .  -group root -exec echo {} \; -print
find .  -type f -group root -exec rm -f  {} \; -print
find .  -type f -mtime 4 –print
find .  -size +5000k -exec ls -lh {} \;
find .  \( -name  "[Aa]*"-o -name "*[Aa]"\)  -print  //  -o   -a

 

 

 

统计在/etc/为起点的目录树中,文件中包含字符串“telnet”(不区分大小写)的文件的数目。请写出这条命令
find /etc –type f  -exec grep  -il  ‘telnet’ {} \; | wc -l

 

18.grep 搜索指定字符串

grep是通用正则表达式分析程序(General Regular Expression Parser)的缩写。 
grep命令可以在它的输入中搜索指定的字符串模式(Pattern)。grep命令的输出是包含输入中指定的字符串模式的行。
grep命令的一般格式:
                grep [option] pattern file

 

-E

用扩充正则表达式进行模式匹配

-i

不区分大小写

-n

在每一输出行前显示文件内的行号

-q

与其他命令一起使用时,抑止输出显示

-s

抑止文件的出错信息

-v

反向匹配

-l

返回匹配到的文件名称

-r

递归搜索

 

 

grep ^public t1.txt
grep public$ t1.txt
grep -n ^$ t1.txt   //查找空行
grep -n '\.$' t1.txt  // 查找以小数点结束的那一行
grep -n \<public t1.txt //查找存在 <public 的行
grep -n ‘\<public’ t1.txt  // 查找存在 public是单词开头的  行
grep -n ‘public\>’ t1.txt
grep -n “\\\\” t1.txt // 查找存在 \ 的行
grep -n ‘\\’ t1.txt    // 查找存在 \ 的行
 
grep -E go+d t1.txt
grep -En 10\{2,4\}A t1.txt
grep -En '10{2,4}A' t1.txt
grep -En '11A|11B' t1.txt
egrep -n 'g(la|oo)d' t1.txt  // glad 或 good
grep -En net\(works\)* t1.txt
egrep 'A(xyz)+C'  t1.txt   // () 中表示成为一个表达式整体
 

grep public  *.txt  // *是通配符

ps aux | grep " ssh grep –v  " grep "  //反向匹配

grep -rn   telnet  /etc  // 递归搜索目录中的所有文件

注意:grep表达式先给shell处理再给grep处理,而双引号能够阻止shell对大部分特殊字符进行解析,但不会阻止对\, $, ` 等的解析,

 

单引号可以阻止shell对所有特殊字符进行解析。

此外,如果shell变量值中出现空格,可以使用双引号或单引号将变量内容括起来,但要注意,双引号内的特殊字符可以保持变量特性,但单引号内的特殊字符则仅为一般字符。

 

很常见的一个组合是grep -oP-o是只输出正则匹配部分的字符,-P(大写)则是启用PCRE兼容的正则表达式,两者结合起来使用往往事半功倍(grep -oE 也不错,-E 支持扩展的正则表达式,比如 [:space:] 表示空格),再巧妙利用正则表达式去做日志分析、文本处理,基本上工作中遇到的类似需求不会有什么大问题,善用shell里面的awk,grep,sed,find几个神器,会对很多linux批量处理任务大有帮助。

有时它也会把txt文件误当做二进制文件,这时如果匹配成功,grep或许只给你一个“Binary file XXX matches”的信息,而你明明知道这是个txt文件,这时就可以用-a选项,或--binary-files=text.

 

19. 正则表达式

 

 

^

在每行的开始进行匹配

$

在每行的末尾进行匹配

\<

在单词的开始进行匹配

\>

在单词的末尾进行匹配

.

对单个任意字符进行匹配(除换行符)

[str]

对str中的任意单个字符进行匹配

[^str]

对任意不在str中的单个字符进行匹配

[a-b]

对a到b之间的任何字符进行匹配

\

抑止后面的一个字符的特殊含义

*

对前一项(item)进行0次或多次重复匹配

 

 

 

 

+

对前一项进行1次或多次重复匹配

?

对前一项进行0次或1次重复匹配

{j}

对前一项进行j次重复匹配

{j,}

对前一项进行j次或更多次重复匹配

{,k}

对前一项最多进行k次重复匹配

{j,k}

对前一项进行j到k次重复匹配

s|t

匹配s项或t项中的一项

(exp)

将exp作为单项处理

 

\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符,包括换行
\d匹配数字
\b匹配单词的开始或结束
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置

 

单行模式更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配)。

 

多行模式更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
忽略大小写指定不区分大小写的匹配。

 

 

 

注:正则表达式与通配符与特殊字符是不同的,有些工具如ls 是不支持正则表达式的。下面列举:

(1)通配符和特殊字符中! 表示逻辑上的非;而正则表达式中使用 ^ 表示。

(2) $ 表示变量引用;表示行尾。

(3)* 表示任意0或多个字符;表示重复0个或多个字符。

(4)?表示一定有一个字符;表示重复0次或1次。

(5)需要注意的是#,! 在正则表达式中没有特殊的含义,故在vim 中当做字符查询时无需使用转义字符\ 进行转义, $ 需要转义。

grep ‘^#'  t1.txt  // 查找行首以 # 开始的一行

grep '!$'  t1.txt  // 搜索行尾为!的一行

 

(6)[ ] 行为一致

 

 

正则表达式在vi 中的使用:

在当前行中删除从aa到zz的所有字符。
:s/aa.*zz//
在整个文件用and代替所有的&字符。
:1,$s/&/and/g   // g是全局替换,也就是一行中多次出现都要替换

:1,$s/\$/and/ // $是特殊字符
在每一行的行首插入字符串new
:1,$s/^/new/
在第2行到第5行的行尾插入字符串@@
:2,5s/$/@@/g    

去掉行首的所有数字字符
:s/^[0-9][0-9]*//

 

:1,$s/?.*//  只保留 url 中的 uri 部分

:g!/dd/d 删除不含字符串'dd'的行

 

:g!/\<dd/d 删除不含以'dd'开头字符串的行
:g/^$/d  删除空白行

提取分组 \1, \2 ...

 

 

20. 命令重定向

比如./tesh.sh > output,其中> file  等价于 1> file,就是把输出重定向到文件中。
对应的,2>&1 是把标准错误重定向到标准输出
而 &> file 是把标准输出和标准错误重定向到file

注意 : 即使是后台进程,如果没有重定向输出且没有将日志打印在 log ,那还是会将输出和错误打印在标准输出.

./run.sh > run.log  2>&1 // 前台进程,重定向输出

./run.sh > run.log 2 > &1 & // 后台进程,重定向输出

./run.sh & // 后台进程,里面可以将日志打印在 log.

 

21 . UNIX时间戳与时间字符串的转换命令

#UNIX的时间戳转换为时间字符串

SELECT FROM_UNIXTIME( 1317030898, '%Y-%m-%d' ); 
date -d '1970-01-01 UTC 1317030898 seconds' 

date -d @1317030898 

date -d +10hour +"%Y-%m-%d %H:%M:%S"

date -d +1day +"%Y%m"

#时间字符串转换为UNIX的时间戳

date -d "2010-10-18 00:00:00" +%s

 #转化为天

date -d '1970-01-01 UTC 15988 days'

Thu Oct 10 08:00:00 CST 2013

 #计算距离1970-01-01到现在的天数

echo $(($(date +%s)/86400))  
16407

22. 数据同步、自动登录

rsync/scp/ftp( Add /usr/sbin/nologin in the /etc/shells/)、expect 脚本

23. crontab 需要注意的一些问题

脚本中涉及文件路径时全部写绝对路径;
脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
$ cat start_cbp.sh
 #!/bin/bash
source /etc/profile        # 引入 profile环境变量
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
当手动执行脚本OK,但是crontab 不执行时或者执行失败(如 python import module 失败)。这时可以大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile; /bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

24. 通过端口号查询监听的进程

lsof -Pnl +M -i4 | grep 2222

-i4 表示ipv4

netstat -tunpl | grep 48369 # root

lsof -i:port

参考:http://deerchao.net/tutorials/regex/regex.htm

《鸟哥的linux私房菜》

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值