《鸟哥的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

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

《鸟哥的linux私房菜》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林欣哲

图解Git合并--Merge和Rebase

项目初始情况 ? Merge fast-forward ? 快速合并,直接把指针指向前去,无冲突要解决。 非 fast-forward ? 保留历史记录,解决冲...

2717
来自专栏性能与架构

这个sql为什么没有用到索引

用户users 表中对 create_time 字段建有索引 现在查询某个时间段的用户,通过explain发现下面这个sql 没有用到索引 explain ...

3165
来自专栏杨建荣的学习笔记

数据刷新中的并行改进(二) (r5笔记第76天)

在之前的博文【数据刷新中的并行改进(r5笔记第72天)】中分享了数据刷新中的并行改进建议,但是对于方案的落地还是有很多的细节需要实现。 首先是关于很多的表怎么把...

2404
来自专栏yl 成长笔记

oracle 正则表达的使用

最近遇到有个项目,需要根据文件存储的根目录地址来判断是在云端获取,还是本地获取, 先看下具体有几个不同的根目录:

562
来自专栏calmound

getchar

跟你分享个东西,我也是刚刚在网上查到的,和我想的差不多,呵呵~~~~ getchar是以行为单位进行存取的。 当用getchar进行输入时,如果输入的第一个字符...

3366
来自专栏coder修行路

Nginx location 匹配顺序整理

Nginx location模块整理 具体的Nginx安装就不在这里描述了,这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /e...

2547
来自专栏数据之美

shell 学习笔记(16)

转载请注明出处: https://cloud.tencent.com/developer/user/1177713/activities 注:以前的1-15连载...

23110
来自专栏杨建荣的学习笔记

半自动化运维之动态添加数据文件(二) (r5笔记第56天)

接着上一篇的内容:半自动化运维之动态添加数据文件(一) (r5笔记第55天) 我们可以通过监控表空间的情况,然后映射匹配文件系统中的挂载点情况,通过随机函数在各...

2436
来自专栏石瞳禅的互联网实验室

关于Logstash中grok插件的正则表达式例子

近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属。

881
来自专栏容器云生态

shell基本命令

有关文件显示的命令: du --exclude=iso  -sh  .        //统计当前除了iso这个目录的其他文件大小 ls -F        ...

2117

扫码关注云+社区