Linux汇总

argument list too long

有时候会出现这种问题,比如rm, cp, ls -l, mv等。
可以使用-exec参数,链接在这里
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。

看例子:

find ./ -name “*.txt” -exec ls -l “{}” \;
查找当前目录的.txt文件并以列表形式列出来

find ./ -name “*.txt” -exec mv “{}” “{}d” \;
批量修改当前目录下.txt文件的后缀名改为.txtd

find ./ -name “*.txt” -exec cp “{}” path \;
批量拷贝当前目录下的.txt文件到path下

find . -type f -exec grep ‘config_dir_path’ -l {} \;
查找内容中包含‘config_dir_path’的文件列表

解释
-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
{} 花括号代表前面find查找出来的文件名。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿 {},一个空格和一个\,最后是一个分号。 cmd {} ;

例子:
find ./ -name “*.tmp” -exec rm -rf “{}” /;
删除所有的临时文件

查找

grep指定文件后缀查找,只需要加上–include参数即可,如

grep -rn --include "*.cpp" msra
在所有的cpp文件中搜索带有字符串"msra"的信息

递归查找目录下所有jpg文件,并统计数量
ls -lR | grep "jpg" | wc -l

查找某个目录下各子目录文件数量,并显示出来
find . -maxdepth 1 -type d | while read dir; do count=$(find "$dir" -type f | wc -l); echo "$dir : $count"; done

不区分大小写,加上-i

反向查找,即不包含XX,加上-v
比如,查找一段日志Log.txt中不包含error字符串的行,且不区分大小写查找
grep -rn -i -v "error" --include="Log.txt"

文件操作

把1个文件追加至另1个文件末尾

cat 要复制的文件 >> 复制后的文件

统计当前文件夹下的文件个数、目录个数

转载自http://www.jb51.net/article/56474.htm,使用正则匹配

只查找目录
grep "^d"
只查找文件
grep "^-"

查找指定后缀的文件的个数http://www.oicto.com/linux-find-wc/

如查找当前目录中后缀为jpg文件的个数:find ./ -name “*.jpg” | wc -l

去除文件中的重复行

sort命令可以将输入的文件内容进行排序,而uniq命令可以去除重复的行,可以将这两个命令结合起来使用,也可以直接用sort -u

sort file.txt | uniq > newfile.txt
sort -u file.txt > newfile.txt

删除文本中所有空行

awk NF file.txt > newfile.txt

压缩/解压缩

tar命令

tar -zcv -f filename.tar.gz 要被压缩的文件或目录名称
tar -zxv -f filename.tar.gz -C ./ 欲解压缩的目录

unrar

转载自http://blog.csdn.net/pfanaya/article/details/6258741
可以用unrar命令解压rar后缀的文件

  unrar e test.rar 解压文件到当前目录
  unrar x test.rar /path/to/extract
  unrar l test.rar 查看rar中的文件
  unrar v test.rar 更详细
  unrar t test.rar 测试是否可以成功解压

zip/unzip

转载自http://www.jb51.net/LINUXjishu/105916.html
这篇文章主要介绍了zip/unzip压缩解压缩命令的使用方法及参数的说明,需要的朋友可以参考下
1、把/home目录下面的mydata目录压缩为mydata.zip
zip -r mydata.zip mydata #压缩mydata目录
2、把/home目录下面的mydata.zip解压到mydatabak目录里面
unzip mydata.zip -d mydatabak
3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip
zip -r abc123.zip abc 123.txt
4、把/home目录下面的wwwroot.zip直接解压到/home目录里面
unzip wwwroot.zip
5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面
unzip abc*.zip
6、查看把/home目录下面的wwwroot.zip里面的内容
unzip -v wwwroot.zip
7、验证/home目录下面的wwwroot.zip是否完整
unzip -t wwwroot.zip
8、把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录
unzip -j wwwroot.zip

主要参数

-c:将解压缩的结果
-l:显示压缩文件内所包含的文件
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换
-t:检查压缩文件是否正确
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其它文件解压缩到目录中
-v:执行是时显示详细的信息
-z:仅显示压缩文件的备注文字
-a:对文本文件进行必要的字符转换
-b:不要对文本文件进行字符转换
-C:压缩文件中的文件名称区分大小写
-j:不处理压缩文件中原有的目录路径
-L:将压缩文件中的全部文件名改为小写
-M:将输出结果送到more程序处理
-n:解压缩时不要覆盖原有的文件
-o:不必先询问用户,unzip执行后覆盖原有文件
-P:使用zip的密码选项
-q:执行时不显示任何信息
-s:将文件名中的空白字符转换为底线字符
-V:保留VMS的文件版本信息
-X:解压缩时同时回存文件原来的UID/GID

apt-get命令

转载自http://man.linuxde.net/apt-get
使用apt-get出现404错误时,更新一下源

apt-get update

sed

关于用法在这里http://www.jb51.net/LINUXjishu/144593.html

全文如下
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed使用参数

复制代码

代码如下:

[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』

function:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

以行为单位的新增/删除

将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!

复制代码

代码如下:

[root@www ~]# nl /etc/passwd | sed ‘2,5d’
1 root❌0:0:root:/root:/bin/bash
6 sync❌5:0:sync:/sbin:/bin/sync
7 shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
…(后面省略)…

sed 的动作为 ‘2,5d’ ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 ‘’ 两个单引号括住喔!

只要删除第 2 行

复制代码

代码如下:

nl /etc/passwd | sed ‘2d’

要删除第 3 到最后一行

复制代码

代码如下:

nl /etc/passwd | sed ‘3,$d’

在第二行后(亦即是加在第三行)加上『drink tea?』字样!

复制代码

代码如下:

[root@www ~]# nl /etc/passwd | sed ‘2a drink tea’
1 root❌0:0:root:/root:/bin/bash
2 bin❌1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon❌2:2:daemon:/sbin:/sbin/nologin
…(后面省略)…

那如果是要在第二行前

复制代码

代码如下:

nl /etc/passwd | sed ‘2i drink tea’

如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or …』与『drink beer?』

复制代码

代码如下:

[root@www ~]# nl /etc/passwd | sed '2a Drink tea or …\

drink beer ?’
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
Drink tea or …
drink beer ?
daemon❌2:2:daemon:/sbin:/sbin/nologin
…(后面省略)…

每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。

以行为单位的替换与显示

将第2-5行的内容取代成为『No 2-5 number』呢?

复制代码

代码如下:

[root@www ~]# nl /etc/passwd | sed ‘2,5c No 2-5 number’
1 root❌0:0:root:/root:/bin/bash
No 2-5 number
6 sync❌5:0:sync:/sbin:/bin/sync
…(后面省略)…

透过这个方法我们就能够将数据整行取代了!

仅列出 /etc/passwd 文件内的第 5-7 行

复制代码

代码如下:

[root@www ~]# nl /etc/passwd | sed -n ‘5,7p’
5 lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync❌5:0:sync:/sbin:/bin/sync
7 shutdown❌6:0:shutdown:/sbin:/sbin/shutdown

可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。

数据的搜寻并显示
搜索 /etc/passwd有root关键字的行

复制代码

代码如下:

nl /etc/passwd | sed ‘/root/p’
root❌0:0:root:/root:/bin/bash
root❌0:0:root:/root:/bin/bash
daemon❌1:1:daemon:/usr/sbin:/bin/sh
bin❌2:2:bin:/bin:/bin/sh
sys❌3:3:sys:/dev:/bin/sh
sync❌4:65534:sync:/bin:/bin/sync
…下面忽略

如果root找到,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含模板的行。

复制代码

代码如下:

nl /etc/passwd | sed -n ‘/root/p’
1 root❌0:0:root:/root:/bin/bash

数据的搜寻并删除
删除/etc/passwd所有包含root的行,其他行输出

复制代码

代码如下:

nl /etc/passwd | sed ‘/root/d’
2 daemon❌1:1:daemon:/usr/sbin:/bin/sh
3 bin❌2:2:bin:/bin:/bin/sh
…下面忽略
#第一行的匹配root已经删除了

数据的搜寻并执行命令
找到匹配模式eastern的行后,

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

复制代码

代码如下:

nl /etc/passwd | sed -n ‘/root/{s/bash/blueshell/;p}’ 1 root❌0:0:root:/root:/bin/blueshell

如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出

复制代码

代码如下:

nl /etc/passwd | sed -n ‘/bash/{s/bash/blueshell/;p;q}’
1 root❌0:0:root:/root:/bin/blueshell

最后的q是退出。

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

复制代码

代码如下:

sed ‘s/要被取代的字串/新的字串/g’

先观察原始信息,利用 /sbin/ifconfig 查询 IP

复制代码

代码如下:

[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
…(以下省略)…

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

复制代码

代码如下:

[root@www ~]# /sbin/ifconfig eth0 | grep ‘inet addr’ | sed ‘s/^.*addr://g’
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除

复制代码

代码如下:

[root@www ~]# /sbin/ifconfig eth0 | grep ‘inet addr’ | sed ‘s/^.addr://g’ | sed 's/Bcast.$//g’
192.168.1.100

多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

复制代码

代码如下:

nl /etc/passwd | sed -e ‘3,$d’ -e ‘s/bash/blueshell/’
1 root❌0:0:root:/root:/bin/blueshell
2 daemon❌1:1:daemon:/usr/sbin:/bin/sh

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

直接修改文件内容(危险动作)

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

复制代码

代码如下:

[root@www ~]# sed -i ‘s/.$/!/g’ regular_express.txt

利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』

复制代码

代码如下:

[root@www ~]# sed -i ‘$a # This is a test’ regular_express.txt

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!

sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

流编辑器sed:

sed一次处理一行文件并把输出送往屏幕。sed把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space)。一旦sed完成对模式空间中的行的处理,模式空间中的行就被送往屏幕。行被处理完成之后,就被移出模式空间,程序接着读入下一行,处理,显示,移出…文件输入的最后一行被处理完以后sed结束。通过存储每一行在临时缓冲区,然后在缓冲区中操作该行,保证了原始文件不会被破坏。

  1. sed的命令和选项:

命令 功能描述
a\ 在当前行的后面加入一行或者文本。
c\ 用新的文本改变或者替代本行的文本。
d 从pattern space位置删除行。
i\ 在当前行的上面插入文本。
h 拷贝pattern space的内容到holding buffer(特殊缓冲区)。
H 追加pattern space的内容到holding buffer。
g 获得holding buffer中的内容,并替代当前pattern space中的文本。
G 获得holding buffer中的内容,并追加到当前pattern space的后面。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
p 打印pattern space中的行。
P 打印pattern space中的第一行。
q 退出sed。
w file 写并追加pattern space到file的末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
s/re/string 用string替换正则表达式re。
= 打印当前行号码。
替换标记
g 行内全面替换,如果没有g,只替换第一个匹配。
p 打印行。
x 互换pattern space和holding buffer中的文本。
y 把一个字符翻译为另一个字符(但是不能用于正则表达式)。
选项
-e 允许多点编辑。
-n 取消默认输出。

需要说明的是,sed中的正则和grep的基本相同,完全可以参照本系列的第一篇中的详细说明。

  1. sed实例:
    /> cat testfile
    northwest NW Charles Main 3.0 .98 3 34
    western WE Sharon Gray 5.3 .97 5 23
    southwest SW Lewis Dalsass 2.7 .8 2 18
    southern SO Suan Chin 5.1 .95 4 15
    southeast SE Patricia Hemenway 4.0 .7 4 17
    eastern EA TB Savage 4.4 .84 5 20
    northeast NE AM Main Jr. 5.1 .94 3 13
    north NO Margot Weber 4.5 .89 5 9
    central CT Ann Stephens 5.7 .94 5 13
/> sed '/north/p' testfile #如果模板north被找到,sed除了打印所有行之外,还有打印匹配行。
northwest       NW      Charles Main           3.0     .98     3       34
northwest       NW      Charles Main           3.0     .98     3       34
western          WE      Sharon Gray           5.3     .97     5       23
southwest      SW      Lewis Dalsass          2.7     .8       2       18
southern        SO       Suan Chin               5.1     .95     4       15
southeast       SE       Patricia Hemenway   4.0     .7       4       17
eastern           EA      TB Savage               4.4     .84     5       20
northeast        NE      AM Main Jr.              5.1     .94     3       13
northeast        NE      AM Main Jr.              5.1     .94     3       13
north              NO      Margot Weber         4.5     .89     5       9
north              NO      Margot Weber         4.5     .89     5       9
central            CT      Ann Stephens          5.7     .94     5       13

#-n选项取消了sed的默认行为。在没有-n的时候,包含模板的行被打印两次,但是在使用-n的时候将只打印包含模板的行。
/> sed -n '/north/p' testfile
northwest       NW      Charles Main    3.0     .98     3       34
northeast        NE      AM Main Jr.       5.1     .94     3       13
north              NO      Margot Weber  4.5     .89     5       9

/> sed '3d' testfile  #第三行被删除,其他行默认输出到屏幕。
northwest       NW     Charles Main            3.0     .98     3       34
western          WE      Sharon Gray           5.3     .97     5       23
southern         SO      Suan Chin               5.1     .95     4       15
southeast       SE       Patricia Hemenway   4.0     .7       4       17
eastern           EA      TB Savage               4.4     .84     5       20
northeast       NE       AM Main Jr.              5.1     .94     3       13
north             NO       Margot Weber         4.5     .89     5       9
central           CT       Ann Stephens          5.7     .94     5       13

/> sed '3,$d' testfile  #从第三行删除到最后一行,其他行被打印。$表示最后一行。
northwest       NW      Charles Main    3.0     .98     3       34
western          WE      Sharon Gray    5.3     .97     5       23

/> sed '$d' testfile    #删除最后一行,其他行打印。
northwest       NW     Charles Main           3.0     .98     3       34
western          WE     Sharon Gray           5.3     .97     5       23
southwest       SW    Lewis Dalsass          2.7     .8      2       18
southern         SO     Suan Chin              5.1     .95     4       15
southeast       SE      Patricia Hemenway   4.0     .7      4       17
eastern           EA      TB Savage             4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north             NO      Margot Weber        4.5     .89     5       9

/> sed '/north/d' testfile #删除所有包含north的行,其他行打印。
western           WE      Sharon Gray           5.3     .97     5       23
southwest       SW      Lewis Dalsass          2.7     .8      2       18
southern          SO      Suan Chin               5.1     .95     4       15
southeast         SE      Patricia Hemenway   4.0     .7       4       17
eastern            EA      TB Savage               4.4     .84     5       20
central             CT      Ann Stephens          5.7     .94     5       13

#s表示替换,g表示命令作用于整个当前行。如果该行存在多个west,都将被替换为north,如果没有g,则只是替换第一个匹配。
/> sed 's/west/north/g' testfile
northnorth      NW     Charles Main           3.0     .98    3       34
northern         WE      Sharon Gray          5.3     .97    5       23
southnorth      SW     Lewis Dalsass         2.7     .8      2       18
southern         SO      Suan Chin              5.1     .95    4       15
southeast       SE      Patricia Hemenway   4.0     .7      4       17
eastern           EA      TB Savage             4.4     .84     5       20
northeast       NE      AM Main Jr.              5.1     .94    3       13
north             NO      Margot Weber        4.5     .89     5       9
central            CT      Ann Stephens        5.7     .94     5       13

/> sed -n 's/^west/north/p' testfile #-n表示只打印匹配行,如果某一行的开头是west,则替换为north。
northern        WE      Sharon Gray     5.3     .97     5       23

#&符号表示替换字符串中被找到的部分。所有以两个数字结束的行,最后的数字都将被它们自己替换,同时追加.5。
/> sed 's/[0-9][0-9]$/&.5/' testfile
northwest       NW      Charles Main          3.0     .98     3       34.5
western          WE      Sharon Gray           5.3     .97     5       23.5
southwest       SW      Lewis Dalsass        2.7     .8       2       18.5
southern         SO      Suan Chin              5.1     .95     4       15.5
southeast       SE      Patricia Hemenway   4.0     .7       4       17.5
eastern           EA      TB Savage              4.4     .84     5       20.5
northeast        NE      AM Main Jr.             5.1     .94     3       13.5
north              NO      Margot Weber        4.5     .89     5       9
central            CT      Ann Stephens         5.7     .94     5       13.5

/> sed -n 's/Hemenway/Jones/gp' testfile  #所有的Hemenway被替换为Jones。-n选项加p命令则表示只打印匹配行。
southeast       SE      Patricia Jones  4.0     .7      4       17

#模板Mar被包含在一对括号中,并在特殊的寄存器中保存为tag 1,它将在后面作为\1替换字符串,Margot被替换为Marlianne。
/> sed -n 's/\(Mar\)got/\1lianne/p' testfile
north           NO      Marlianne Weber 4.5     .89     5       9

#s后面的字符一定是分隔搜索字符串和替换字符串的分隔符,默认为斜杠,但是在s命令使用的情况下可以改变。不论什么字符紧跟着s命令都认为是新的分隔符。这个技术在搜索含斜杠的模板时非常有用,例如搜索时间和路径的时候。
/> sed 's#3#88#g' testfile
northwest       NW      Charles Main            88.0    .98     88     884
western          WE       Sharon Gray           5.88    .97     5       288
southwest       SW      Lewis Dalsass          2.7     .8       2       18
southern         SO       Suan Chin               5.1     .95     4       15
southeast       SE        Patricia Hemenway   4.0     .7        4       17
eastern           EA       TB Savage               4.4     .84      5      20
northeast        NE       AM Main Jr.              5.1     .94      88     188
north              NO       Margot Weber         4.5     .89      5       9
central            CT       Ann Stephens          5.7     .94      5       188

#所有在模板west和east所确定的范围内的行都被打印,如果west出现在esst后面的行中,从west开始到下一个east,无论这个east出现在哪里,二者之间的行都被打印,即使从west开始到文件的末尾还没有出现east,那么从west到末尾的所有行都将打印。
/> sed -n '/west/,/east/p' testfile
northwest       NW      Charles Main           3.0     .98      3      34
western          WE      Sharon Gray            5.3     .97     5      23
southwest       SW     Lewis Dalsass          2.7     .8       2      18
southern         SO      Suan Chin               5.1     .95     4      15
southeast        SE      Patricia Hemenway    4.0     .7       4      17

/> sed -n '5,/^northeast/p' testfile  #打印从第五行开始到第一个以northeast开头的行之间的所有行。
southeast       SE      Patricia Hemenway   4.0     .7       4       17
eastern           EA      TB Savage              4.4     .84     5       20
northeast        NE      AM Main Jr.             5.1     .94     3       13

#-e选项表示多点编辑。第一个编辑命令是删除第一到第三行。第二个编辑命令是用Jones替换Hemenway。
/> sed -e '1,3d' -e 's/Hemenway/Jones/' testfile
southern        SO      Suan Chin          5.1     .95     4       15
southeast       SE      Patricia Jones      4.0     .7      4       17
eastern          EA      TB Savage          4.4     .84     5       20
northeast       NE      AM Main Jr.         5.1     .94     3       13
north             NO      Margot Weber    4.5     .89     5       9
central           CT      Ann Stephens     5.7     .94     5       13

/> sed -n '/north/w newfile' testfile #将所有匹配含有north的行写入newfile中。
/> cat newfile
northwest       NW      Charles Main     3.0     .98     3       34
northeast       NE      AM Main Jr.         5.1     .94     3       13
north             NO      Margot Weber    4.5     .89     5       9

/> sed '/eastern/i\ NEW ENGLAND REGION' testfile #i是插入命令,在匹配模式行前插入文本。
northwest       NW      Charles Main          3.0     .98      3       34
western          WE      Sharon Gray           5.3     .97     5       23
southwest       SW      Lewis Dalsass         2.7     .8      2       18
southern         SO      Suan Chin              5.1     .95     4       15
southeast        SE      Patricia Hemenway   4.0     .7      4       17
NEW ENGLAND REGION
eastern          EA      TB Savage              4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north             NO      Margot Weber        4.5     .89     5       9
central           CT      Ann Stephens         5.7     .94     5       13

#找到匹配模式eastern的行后,执行后面花括号中的一组命令,每个命令之间用逗号分隔,n表示定位到匹配行的下一行,s/AM/Archie/完成Archie到AM的替换,p和-n选项的合用,则只是打印作用到的行。
/> sed -n '/eastern/{n;s/AM/Archie/;p}' testfile
northeast       NE      Archie Main Jr. 5.1     .94     3       13

#-e表示多点编辑,第一个编辑命令y将前三行中的所有小写字母替换为大写字母,-n表示不显示替换后的输出,第二个编辑命令将只是打印输出转换后的前三行。注意y不能用于正则。
/> sed -n -e '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' -e '1,3p' testfile
NORTHWEST       NW      CHARLES MAIN     3.0     .98     3       34
WESTERN           WE      SHARON GRAY      5.3     .97     5       23
SOUTHWEST       SW      LEWIS DALSASS   2.7     .8      2       18

/> sed '2q' testfile  #打印完第二行后退出。
northwest       NW      Charles Main    3.0     .98     3       34
western          WE      Sharon Gray     5.3     .97     5       23

#当模板Lewis在某一行被匹配,替换命令首先将Lewis替换为Joseph,然后再用q退出sed。
 /> sed '/Lewis/{s/Lewis/Joseph/;q;}' testfile
northwest       NW      Charles Main      3.0     .98     3       34
western          WE      Sharon Gray      5.3     .97     5       23
southwest       SW      Joseph Dalsass  2.7     .8      2       18

#在sed处理文件的时候,每一行都被保存在pattern space的临时缓冲区中。除非行被删除或者输出被取消,否则所有被处理过的行都将打印在屏幕上。接着pattern space被清空,并存入新的一行等待处理。在下面的例子中,包含模板的northeast行被找到,并被放入pattern space中,h命令将其复制并存入一个称为holding buffer的特殊缓冲区内。在第二个sed编辑命令中,当达到最后一行后,G命令告诉sed从holding buffer中取得该行,然后把它放回到pattern space中,且追加到现在已经存在于模式空间的行的末尾。
 /> sed -e '/northeast/h' -e '$G' testfile
northwest       NW     Charles Main            3.0    .98     3       34
western          WE     Sharon Gray            5.3    .97     5       23
southwest       SW    Lewis Dalsass          2.7     .8       2       18
southern         SO     Suan Chin               5.1     .95     4       15
southeast       SE      Patricia Hemenway   4.0     .7       4       17
eastern           EA      TB Savage              4.4     .84     5       20
northeast       NE      AM Main Jr.              5.1     .94     3       13
north             NO      Margot Weber         4.5     .89     5       9
central           CT      Ann Stephens          5.7     .94     5       13
northeast       NE      AM Main Jr.              5.1     .94     3       13

#如果模板WE在某一行被匹配,h命令将使得该行从pattern space中复制到holding buffer中,d命令在将该行删除,因此WE匹配行没有在原来的位置被输出。第二个命令搜索CT,一旦被找到,G命令将从holding buffer中取回行,并追加到当前pattern space的行末尾。简单的说,WE所在的行被移动并追加到包含CT行的后面。
/> sed -e '/WE/{h;d;}' -e '/CT/{G;}' testfile
northwest       NW    Charles Main           3.0     .98     3       34
southwest       SW    Lewis Dalsass         2.7     .8      2       18
southern         SO     Suan Chin              5.1     .95     4       15
southeast       SE      Patricia Hemenway   4.0     .7      4       17
eastern           EA     TB Savage              4.4     .84     5       20
northeast       NE      AM Main Jr.              5.1     .94     3       13
north             NO      Margot Weber         4.5     .89     5       9
central           CT      Ann Stephens          5.7     .94     5       13
western         WE      Sharon Gray           5.3     .97     5       23

#第一个命令将匹配northeast的行从pattern space复制到holding buffer,第二个命令在读取的文件的末尾时,g命令告诉sed从holding buffer中取得行,并把它放回到pattern space中,以替换已经存在于pattern space中的。简单说就是包含模板northeast的行被复制并覆盖了文件的末尾行。
/> sed -e '/northeast/h' -e '$g' testfile
northwest       NW     Charles Main          3.0     .98     3       34
western          WE      Sharon Gray         5.3     .97      5       23
southwest       SW     Lewis Dalsass        2.7     .8       2       18
southern         SO      Suan Chin             5.1     .95     4       15
southeast       SE      Patricia Hemenway   4.0     .7      4       17
eastern           EA      TB Savage             4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north             NO      Margot Weber        4.5     .89     5       9
northeast       NE      AM Main Jr.             5.1     .94     3       13

#模板WE匹配的行被h命令复制到holding buffer,再被d命令删除。结果可以看出WE的原有位置没有输出。第二个编辑命令将找到匹配CT的行,g命令将取得holding buffer中的行,并覆盖当前pattern space中的行,即匹配CT的行。简单的说,任何包含模板northeast的行都将被复制,并覆盖包含CT的行。    
/> sed -e '/WE/{h;d;}' -e '/CT/{g;}' testfile
northwest       NW    Charles Main           3.0     .98      3      34
southwest       SW    Lewis Dalsass         2.7     .8       2       18
southern         SO     Suan Chin              5.1     .95      4      15
southeast       SE      Patricia Hemenway   4.0     .7       4      17
eastern          EA      TB Savage              4.4     .84      5      20
northeast       NE      AM Main Jr.              5.1     .94     3      13
north             NO      Margot Weber        4.5     .89      5      9
western         WE      Sharon Gray           5.3     .97     5      23

#第一个编辑中的h命令将匹配Patricia的行复制到holding buffer中,第二个编辑中的x命令,会将holding buffer中的文本考虑到pattern space中,而pattern space中的文本被复制到holding buffer中。因此在打印匹配Margot行的地方打印了holding buffer中的文本,即第一个命令中匹配Patricia的行文本,第三个编辑命令会将交互后的holding buffer中的文本在最后一行的后面打印出来。
 /> sed -e '/Patricia/h' -e '/Margot/x' -e '$G' testfile
northwest       NW      Charles Main           3.0      .98      3       34
western           WE      Sharon Gray           5.3     .97      5       23
southwest       SW      Lewis Dalsass         2.7      .8       2       18
southern         SO      Suan Chin               5.1      .95     4       15
southeast       SE       Patricia Hemenway    4.0      .7       4       17
eastern           EA      TB Savage               4.4      .84     5       20
northeast       NE       AM Main Jr.               5.1     .94      3       13
southeast       SE      Patricia Hemenway      4.0     .7       4       17
central            CT      Ann Stephens            5.7     .94     5       13

太长了,这里在项目上我主要使用sed -i命令进行替换,命令如下

行首替换 sed -i ‘s/^/替换的字符串/g’ 文件名

行尾替换 sed -i ‘s/$/替换的字符串/g’ 文件名

这里有时候进行行尾替换时,会自动加上^M,其实就是换行,在Windows下是\r\n,在Linux下是\n

所以在进行行尾替换的时候还需要加上一句 sed -i ‘s/^M//g’ 文件名

这里需要注意的一个地方是,如何输入^M,在Linux命令行模式下是Ctrl+V+M三个一起按,但是Linux得vim里用这种方法无法实现,这里采用一个折中的方法。

在Windows的gVim下,插入模式中可以使用Ctrl+Q然后再Ctrl+M,这里可以先把.sh文件在Windows下的gVim里改好,再传到Linux上即可。

进程管理

Kill命令

使用ps aux可以查看当前系统正在运行的进程,如果是多用户,附带grep指令指定某个用户,即可查看某个用户的进程

ps aux|grep shaom

使用kill指令干掉某个进程,如果失败,尝试使用

kill -9

Linux工具

TMUX

链接在这里
补充一下
C-b然后C-o可以互换分屏的位置

查看机器支持的指令集

在使用tensorflow CPU模式时,如果使用pip安装的通用的tensorflow版本,那么会出现警告

Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA

使用如下指令可以查看目前的机器支持的指令集

gcc -march=natice -Q --help=target | grep march

git常用命令汇总

下载指定版本号

git clone https://github.com/xx.git -b x.x.x

更新到最新

git pull origin master

当使用git clone --recursive下载中断时,使用下面的命令可以继续

git submodule update --init --recursive

连接与挂载

使用软连接时出现

too many levels of symbolic links

解决办法是,创建软连接时,要写上绝对路径而不是相对路径

查看挂载信息:df
查看软连接信息:查看链接文件命令,比如你有一个软链接/etc/php.ini 想查找他的链接文件,那可以直接用:ls -lih /etc/php.ini命令,则显示为:6390969 lrwxrwxrwx 1 root root 27 12-24 16:08 /etc/php.ini -> /usr/local/Zend/etc/php.ini,清楚的看到他是链接到zend目录下的文件(转载自http://forrest420.iteye.com/blog/1291032)

无法umount解决方案
转载自http://www.cnblogs.com/heric/p/5825244.html
[root@995120-master ~]# umount /drbd/

umount: /drbd: device is busy.
(In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))

解决方式一:
一、查找使用这个文件的进程和命令,具体的操作代码
[root@995120-master ~]# lsof |grep “/drbd”
jbd2/drbd 8219 root cwd DIR 253,0 4096 2 /
jbd2/drbd 8219 root rtd DIR 253,0 4096 2 /
jbd2/drbd 8219 root txt unknown /proc/8219/exe
bash 8510 root cwd DIR 147,0 4096 3801089 /drbd/mysql

二、然后执行ps命令可以查找执行此进程的命令
[root@995120-master ~]# ps -ef|grep 8510
root 8510 8505 0 10:54 pts/0 00:00:00 -bash
root 8536 8455 0 10:58 pts/1 00:00:00 grep 8510

三、强行结束无关进程
[root@localhost ~]# kill -9 8510

四、然后卸载相关挂载
[root@localhost ~]# umount /drbd

解决方式二:
[root@995120-master ~]# lsof -w /drbd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 8510 root cwd DIR 147,0 4096 3801089 /drbd/mysql

注:-w参数表示不打印警告信息.

直接kill -9 8510即可

解决方式 三 :
列出该进程:
[root@995120-master ~]# fuser -m /drbd
/drbd: 8510c

杀掉使用/drbd 挂载点的进程(而且 使用这个进程的用户也会弹出)
[root@995120-master ~]# fuser -km /drbd
/drbd: 8510c

使用此进程的机器用户也踢出掉了,如下:
[root@995120-master mysql]# Connection to 192.168.88.7 closed.
[root@995120-master ~]# umount /drbd/

其中,下面这个命令亲测可用fuser -km /drbd

linux查看磁盘空间占用情况

主要是以下三个命令
df -h // 以人类可读的方式显示磁盘各目录占用大小,如果要显示下一级目录大小,加上–max-depth=1
df -a //显示目录及子目录占用大小
du -sh //显示当前目录占用大小

让进程在后台可靠运行的几种方法

转载自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

调试

查看内存泄漏

valgrind --leak-check=full --show-reachable=yes ./demo

gdb

转载自http://www.cnblogs.com/rosesmall/archive/2012/04/10/2440514.html
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要
把调试信息加到可执行文件中。使用编译 器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

cc -g hello.c -o hello
g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是 运行时的内存地址。当你用
-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

启动 GDB的方法有以下几种:

1、gdb
program也就是你的执行文件,一般在当然目录下。

2、gdb core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生
的文件。

3、gdb
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gd
b会自动attach上去,并调试他。program应该在 PATH环境变量中搜索得到。

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只
例举一些比较常用的参数:

-symbols
-s
从指定文件中读取符号表。

-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。

-core
-c
调试时core dump的core文件。

-directory
-d
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件
。 如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。

在gdb中,运行程序使用r或是run命令。 程序的运行,你有可能需要设置下面四方面的事。

1、程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

2、 运行环境。
path

可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。

3、工作目录。
cd

相当于shell的cd命令。
pwd 显示当前的所在目录。

4、程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb

具体来说就是

例如一个程序名为prog 参数为 -l a -C abc
则,运行gcc/g++ -g prog.c/cpp -o prog

就可以用gdb调试程序prog
#gdb prog

进入gdb调试界面

输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:
set args -l a -C abc

回车后输入

r

即可开始运行

gdb调试STL

使用dbinit_stl_views
具体使用时像下面这样

(gdb) pmap all_gt_bboxes
Map type = std::map<int, std::vector<caffe::NormalizeBBox, std::allocator<caffe::NormalizedBBox> >, std::less<int>, std::allocator<std::pair<int const, std::vector<caffe::NormalizedBBox, std::allocator<caffe::NormalizedBBox> > > > >
Use pmap <variable_name> <left_element_type> < right_element_type> to see the elements in the map.
Map size = 6

配置管理

VIM配置相关

0.修改vimrc
如果修改的vimrc无效,请打印一下 V I M (系统 v i m r c )和 VIM(系统vimrc)和 VIM(系统vimrc)和HOME(用户的vimrc),确认下加载的rc文件在哪里
1.显示行号、设置tab字符数,直接修改vimrc即可。想要知道vim加载的是哪一个vimrc,
vi一个文档,然后输入:echo $VIM即可看到。
如果修改了vimrc,在不关闭文档的状态下生效,输入:source $VIM
2.代码补全插件youcompleteme,在ubuntu下安装方法,三行代码搞定
sudo apt-get install vim-addon-manager
sudo apt-get install vim-youcompleteme
vim-addons install youcompleteme
具体参考http://www.cnblogs.com/zzqcn/p/4660615.html
3.去掉Scratch Preview窗口
打开.vimrc,增加下列一行
set completeopt-=preview

zsh配置相关

1.安装zsh
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
重新登录终端,如果zsh没有生效,执行以下命令
chsh -s /bin/zsh
2.修改.zshrc,比如别名替换等
alias cls=‘clear’
alias ll=‘ls -l’
alias la=‘ls -a’
alias vi=‘vim’
alias javac=“javac -J-Dfile.encoding=utf8”
alias grep=“grep --color=auto”
alias -s html=mate # 在命令行直接输入后缀为 html 的文件名,会在 TextMate 中打开
alias -s rb=mate # 在命令行直接输入 ruby 文件,会在 TextMate 中打开
alias -s py=vi # 在命令行直接输入 python 文件,会用 vim 中打开,以下类似
alias -s js=vi
alias -s c=vi
alias -s java=vi
alias -s txt=vi
alias -s gz=‘tar -xzvf’
alias -s tgz=‘tar -xzvf’
alias -s zip=‘unzip’
alias -s bz2=‘tar -xjvf’
3.其他插件,主要是安装autojump
git clone git://github.com/joelthelion/autojump.git
之后进入目录,./install.py
然后在.zshrc上加入一行(现在的autojump安装后会提示这一句)
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh

库加载相关

usr/bin/ld: cannot find 错误解决方法(主要看下第2点)
参考:http://blog.siyebocai.cn/20100324_5p424qs7.html
通常在软件编译时出现的usr/bin/ld: cannot find -lxxx的错误,主要的原因是库文件并没有导入的ld检索目录中。
解决方式:

1.确认库文件是否存在,比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无lib123.so, 如果只是存在lib123.so.1,那么可以通过ln -sv lib123.so.1 lib123.so,建立一个连接重建lib123.so.
2.检查/etc/ld.so.conf中的库文件路径是否正确,如果库文件不是使用系统路径,/usr/lib, /usr/local/lib, 那么必须在文件中加入。
3.ldconfig 重建ld.so.cache文件,ld的库文件检索目录存放文件。尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的
库文件导入ld.so.cache.
4.测试,gcc -l123 --verbose.

环境

环境的问题会导致很多莫名的问题,比如今天我在训练SSD时,使用python运行.py文件,可以正确运行下边这行代码

from caffe.proto import caffe_pb2

但是直接运行./data/VOC0712/create_data.sh时出现了问题,原因是使用./命令是在subshell里,subshell默认是zsh,zsh里的python路径和命令行里python搜索路径不一样。在.zshrc里我去掉了anaconda2的路径,就可以正常运行了。

解决 ssh_exchange_identification: read: Connection reset by peer问题

今天在使用gitlab时,在本地服务器上git pull远程分支的代码出现此错误。解决办法,修改/etc/hosts.allow文件,添加sshd: ALL这一行。

[root@localhost Desktop]# vi /etc/hosts.allow
#########################
sshd: ALL ##允许所有ip主机均能连接本机

保存退出后,重启ssh服务

service ssh restart

中文显示异常的问题

关键举措:安装中文locale并设置中文编码
step 1,locale -a查看locale支持是否正常,如果出现类似以下信息,则表明locale异常

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory

step 2,安装locale扩展包

# 英文扩展包
sudo apt-get --reinstall install language-pack-en
# 中文扩展包
sudo apt-get install language-pack-zh-hans

step 3,设置中文utf8编码

export LC_ALL=zh_CN.utf8

Windows7及以上通过ssh映射Linux盘符

1.安装winfsp
地址
选择.msi文件下载并安装
2.安装sshfs-win
地址
点击下载64位安装包,然后安装
3.映射
输入用户名,服务器ip地址,需要挂载的文件夹路径,语法如下

# 例如\\sshfs\20000@10.30.125.38
\\sshfs\username@HOST[\PATH]

在Linux远程终端上使用SSH连接Windows机器

1.参考【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器
2.开启Linux上免密访问,参考这里Windows的ssh免密登录,主要是以下内容
2.1 目标是在Linux上可以免密ssh连接Windows,即Linux --> Win,所以要把Linux的公钥放到Windows上。公钥产生方法:
ssh-keygen -t rsa,一直回车,默认存放在.ssh路径下,将.pub后缀的公钥信息添加到Windows机器上,Windows上默认路径一般是C:\Users\username.ssh。将Linux上id_rsa.pub的内容添加到Windows路径.ssh\authorized_keys下,如果没有authorized_keys,手动创建一个空文本添加。
2.2 修改配置,具体参考博文“修改配置部分”
打开sshd配置文件 C:\ProgramData\ssh\sshd.config ,注意 ProgramData 是隐藏文件夹;
编辑配置文件:
确保以下3条没有被注释
PubkeyAuthentication yes # 使用公钥
AuthorizedKeysFile .ssh/authorized_keys # 公钥位置
PasswordAuthentication no # 免密登录

确保以下2条有注释掉
#Match Group administrators

AuthorizedKeysFile PROGRAMDATA/ssh/administrators_authorized_keys

重启服务:在Windows上搜索服务,重启Openssh相关的服务,然后使用ssh测试。
3.其他参考的博文
实现scp拷贝时无需输入密码
Windows OpenSSH 服务器启用密钥登录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值