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命令,返回真值,否则为假。 |
操作表达式,将当前的文件名送到标准输出设备显示,返回值常为真。 |
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
参考:http://deerchao.net/tutorials/regex/regex.htm
《鸟哥的linux私房菜》