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结束。通过存储每一行在临时缓冲区,然后在缓冲区中操作该行,保证了原始文件不会被破坏。
- 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的基本相同,完全可以参照本系列的第一篇中的详细说明。
- 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
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 服务器启用密钥登录