[Linux+bash]Summary

5 篇文章 0 订阅

#寻找文件
在当前路径下寻找文件名匹配“sql_test_*"的文件。
find . -name "sql_test_*"
寻找在sql_external_company.sql之后生成的文件。
find . -name "sql_test_*" -newer sql_external_company.sql

awk

1.想要读下面这个文件的第7列(以逗号分隔):“神社,仏閣”

0001,Agoop,agoop,00000000,三十三間堂,観光地,“神社,仏閣“,20210701,523536814231

在有双引号的情况下,用cut -d"," -f7会失败,可以用awk命令。

awk -v FPAT='([^,]+)|(\"[^\"]+\")' '{print $7}' area.csv | sed -e 's/"//g'

2.匹配
area.csv

"001","Test","test","00000000","三条・平安神宮・動物園","観光地","神社,仏閣","20210701","20210705","20210703","52355"
"001","Test","test","00000000","三条・平安神宮・動物園","観光地","神社,仏閣","20210701","20210705","20210703","52354"
...

以逗号分隔,第3列是“test" 且第8或第9列是20210701的行

awk -F"," '{if(($3=="\"test\"") && ($8=="\"20210701\"" || $9=="\"20210701\""))print $1}' area.csv

","分隔,第3列是“test" 且第8或第9列是20210701的行打印第1列

awk -F'\",\"' '{if(($3=="test") && ($8=="20210701" || $9=="20210701"))print $1}' area.csv

3.在匹配变量的时候
","为分隔,第3列是${COMPANY_EN}且第10列是${YYYY}${MM}${DD}的行,打印第1列。

awk -F'\",\"' '{if($3=="'${COMPANY_EN}'" && $10=="'${YYYY}${MM}${DD}'")print $1}' ${NAME_MESH}
awk -F'\",\"' –v companyen="${COMPANY_EN}" yyyymmdd="${YYYY}${MM}${DD}" '{if($3==companyen && $10==yyyymmdd)print $1}' ${NAME_MESH}

to sum a column of numbers [duplicate]

https://stackoverflow.com/questions/3096259/bash-command-to-sum-a-column-of-numbers/3096575
把文件里第13列的数字全部加起来

awk 'BEGIN{s=0}{s+=$13}END{print s}' filename #(失败了)
cut -d',' -f13 filename | paste -sd+ | bc #(成功)
cut -d',' -f13 filename | awk '{s+=$1}END{print s}' #成功

看执行时间

time cut -d',' -f13 tmp | awk '{s+=$1}END{print s}'

real 0m12.029s
user 0m21.230s
sys 0m0.872s

time cut -d',' -f13 tmp | paste -sd+ | bc

real 0m15.429s
user 0m22.517s
sys 0m1.332s

2>&1

MSG=`date -d $1  2>&1 >/dev/null`
 if [ $? -ne 0 ]; then
   echp "error: $MSG"
 fi
 }

#?表示最后运行的命令的结束代码(返回值)

https://blog.csdn.net/ithomer/article/details/9288353
/dev/null :代表空设备文件
>:代表重定向到哪里,例如:echo “123” > /home/123.txt
1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 :表示stderr标准错误
&:表示等同于的意思,2>&1,表示2的输出重定向等同于1

1 > /dev/null 2>&1语句含义:

1 > /dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1:接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

两者的不同点在于:
cmd >a 2>a相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
cmd >a 2>&1只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。

/tmp/test.sh > /tmp/test.log 2>&1

这里2>&1 的意思就是将标准错误也输出到标准输出当中。

replace tab

https://unix.stackexchange.com/questions/145299/simple-sed-replacement-of-tabs-mysteriously-failing
sed $'s/\t/,/g' 2_list.txt

remove spaces of file name

https://www.commandlinefu.com/commands/view/4470/replace-space-in-filename

rename "s/ *//g" *.csv

https://superuser.com/questions/783611/split-a-file-by-a-line-prefix

60  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
61  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
64  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

I want to split it out into separate files by the line prefix… like this:
file 60 contains all lines prefixed with “60”
file 61 contains all lines prefixed with “61”

awk -F , '{print>>$1; close($1)}' filename

print会遍历所有行,$1是文件里以,分隔的第一列,

I tried to copy something.

//slow
cp -Rn frames_test/* frames/  
///faster because of parelleling]
ls -1 frames_test/ | xargs -P 16 -I{} cp -Rnv frames_test/{} frames/ 
ls $WORK/newTest/lisa-caffe-public/examples/LRCN_activity_recognition/frames | xargs -P 16 -I{} find $WORK/newTest/lisa-caffe-public/examples/LRCN_activity_recognition/frames/{} -size 0 >> $WORK/log.txt &
//, /media/na下有三个文件夹/a,/b,/c
// 在/a,/b,/c文件夹下分别新建一个文件夹na
root@ken:/media/na#  ls | xargs -I{} mkdir {}/na
ls | xargs -I{} chown na {}/na/

top

top -c -u 15M54105

use “q” to exit.

echo

echo -e "\tHello World!"

自动补零

code=$(printf "%03d" "$i")
code=$(printf %03d $i)
code=$(printf %03g $i)

统计某文件夹下文件、文件夹的个数

(http://blog.sina.com.cn/s/blog_464f6dba01012vwv.html)

统计某文件夹下文件的个数ls -l |grep "^-"|wc -l
统计某文件夹下目录的个数ls -l |grep "^d"|wc -l
统计文件夹下文件的个数,包括子文件夹里的ls -lR|grep "^-"|wc -l
如统计/home/han目录(包含子目录)下的所有js文件则:
ls -lR /home/han|grep js|wc -l
ls -l "/home/han"|grep "js"|wc-l
统计文件夹下目录的个数,包括子文件夹里的ls -lR|grep "^d"|wc -l
ls -lR长列表输出该目录下文件信息(R代表子目录注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)
grep "^-"这里将长列表输出信息过滤一部分,只保留一般文件,
如果只保留目录就是 ^dwc -l统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。
如果只查看文件夹ls -d只能显示一个.find -typed可以看到子文件夹
ls -lF |grep/ls -l |grep'^d' 只看当前目录下的文件夹,不包括往下的文件夹

读取文件特定行

http://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file

sed '10q;d' file
sed "${NUM}q;d" file
sed -n '10,33p;50,53p' file

tail -n+NUM file | head -n1

chmod

chmod +x test.sh
chmod +s caffe/

http://blog.chinaunix.net/uid-20864319-id-448817.html

SUID/SGID/Sticky Bit (档案特殊权限):
SUID (Set UID): 会制作出 s 的权限,权限数字是 4 。这个权限只能作用于可执行文件,不可作用于目录,shell script也不行。使一般使用者在执行文件时,暂时具有该文件拥有者的权限。通常用户去运行一个文件都是以它当前用户去运行的,而chmod u+s则使得任何时候这个文件都以它的user所有者的身份运行
SGID (Set GID): 制作出 s 权限,权限数字是 2 。这个权限可以作用于目录和文件。作用于目录时,在该目录下建立的所有文件和目录的group都会是该目录的group;作用于文件时,则不论使用者是谁,在执行该程序的时候, 他的有效群组 (effective group) 将会变成该程序的群组所有人 (group id)。chmod g+s
Sticky Bit: 制作出 t 权限,权限数字是 1 。can be assigned to files and directories on Unix-like systems。在该权限作用的目录里,如果使用者具有w,x权限,那么他所创建的文件和目录,只有档案的拥有者和root才能删除。
注意:在字符表示权限时,s和t是出现在x的位置的,意思是在可执行的文件和目录时,它们才是有意义的。如果文件或目录本身u、g或o就没有可执行权限,那么它所在的权限组出现的是S或者T,表示空的意思。用数字表示权限,就是在rwx前面加上4、2、1的组合就是了,如1777。

group

newgrp t2g-shinoda2011修改用户组
chgrp t2g-shinoda2011 log.txt修改文件log.txt所在的用户组

& 后台运行

apsvvfb@t2a006172: ./test.sh &

apsvvfb@t2a006172:

use “q”+ process ID to terminate it.

CTRL +Z

强制停止

find,grep

查找当前路径下叫做abc.txt的文件
find . -name "abc.txt"
显示所有所有大小为0的文件:find ./ -size 0
显示所有大于10k的文件:find . -size +10k
显示所有小于10k的文件:find .-size -10k
在当前目录下的所有子文件夹下的所有文件里查找.
grep -r "layer"

diff,comm

diff a.txt b.txt -y > result.txt

如果想对两个有序的文件进行比较,可以使用comm命令。
语法:comm [- 123 ] file1 file2
说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“- ”,则表示从标准输入读取。
comm -1 不显示只出现在第一个文件的行。
comm -2 不显示只出现在第二个文件的行。
comm -3 不显示同时出现在两个文件的行。
comm file1 file2 显示三列,第一列代表只出现在file1的行,第二列代表只出现在file2的行,第三列代表俩个文件同时出现的行
comm -12 显示两个文件同时出现的行 也就是交集
comm -13 显示只出现在第二个文件的行
comm -23 显示只出现在第一个文件的行

ldd

ldd ./build/tools/caffe
或是
ldd ./build/tools/caffe.bin

链接

http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

【硬连接】
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

【软连接】
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

2.通过实验加深理解

[oracle@Linux]$ touch f1          # 创建一个测试文件f1
[oracle@Linux]$ ln f1 f2          # 创建f1的一个硬连接文件f2
[oracle@Linux]$ ln -s f1 f3       # 创建f1的一个符号连接文件f3
[oracle@Linux]$ ls -li            #  -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。

[oracle@Linux]$ echo “I am f1 file” >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory

通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效

3.总结
依此您可以做一些相关的测试,可以得到以下全部结论:
1).删除符号连接f3,对f1,f2无影响;
2).删除硬连接f2,对f1,f3也无影响;
3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。

disk

vim /etc/fstab

查看当前目录下的所有目录以及子目录的大小

http://blog.csdn.net/wangjunjun2008/article/details/19840671
du(disk usage),顾名思义,查看目录/文件占用空间大小

# du

$ du -h
$ du -ah

-h:用K、M、G的人性化形式显示

-a:显示目录和文件

du -h tmp
du -ah tmp

只查看当前目录下的tmp目录(包含子目录)的大小

查看当前目录及其指定深度目录的大小
du -h –-max-depth=0
-–max-depth=n:只深入到第n层目录,此处设置为0,即表示不深入到子目录

du命令的一些常用参数:
-a或-all 显示目录中个别文件的大小
-b或-bytes 显示目录或文件大小时,以byte为单位
-c或–total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和
-D或–dereference-args 显示指定符号连接的源文件大小
-h或–human-readable 以K,M,G为单位,提高信息的可读性
-k或–kilobytes 以1024 bytes为单位
-l或–count-links 重复计算硬件连接的文件
-L或–dereference 显示选项中所指定符号连接的源文件大小
-m或–megabytes 以1MB为单位
-s或–summarize 仅显示总计
-S或–separate-dirs 显示个别目录的大小时,并不含其子目录的大小
-X<文件>或–exclude-from=<文件>
–exclude=<目录或文件> 略过指定的目录或文件
–max-depth=<目录层数> 超过指定层数的目录后,予以忽略

# df 用于查看设备的空间使用率

$ df -lh

wc,cat,paste

wc text.txt
-c 统计字节数。

-l 统计行数。

-m 统计字符数。这个标志不能与 -c 标志一起使用。

-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。

-L 打印最长行的长度。

-help 显示帮助信息

–version 显示版本信息
cat
cat主要有三大功能:

1.一次显示整个文件:cat filename

2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.

3.将几个文件合并为一个文件:cat file1 file2 > file
paste
paste指令会把每个文件以列对列的方式,一列列地加以合并。
paste [-s][-d <间隔字符>][–help][–version][文件…]

显示

less a.txt
more a.txt
tail用于显示指定文件末尾内容
tail -n 5 log2014.log显示文件最后5行内容
tail -n +5 log2014.log从第5行开始显示文件

sed

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

替换操作:s命令 替换文本中的字符串:

sed 's/book/books/' file

文件选项-i,会匹配file文件中每一行的第一个book替换为books:

可是我又看到说使用sed -i可以直接修改源文件的内容。

源文件的内容

sed -i 's/book/books/g' file
http://www.linuxde.net/2013/03/13008.html
但是sed -i -e 's/book/books/g -e 's/abc/de/g'不能用,必须是
sed -in-place -e 's/abc/cba/g' file

全面替换标记g

使用后缀 /g 标记会替换每一行中的所有匹配:
sed 's/book/books/g' file

以及mac下,当想要直接修改源文件时需要加""或者''(删除5-7行)

sed -i "" -e '5,7d' filename

删除

sed '5d' filename 删除第5行
sed '5,7d;12d' filename 删除第5-7行,12行
如果有变量的话,需要用双引号替换单引号

例(MAC系统)

 ln_min=`grep -n "minstaytime" $1 | cut -d":" -f1`
 ln_max=`grep -n "maxstaytime" $1 | cut -d":" -f1`
 ln_having=$[ln_min-1]
 ln_and=$[ln_max-1]
 if [ ${MINSTAYTIME} -eq 0 ] && [ ${MAXSTAYTIME} -eq 1440 ];then
    sed -i '' -e "${ln_having},${ln_max}d" $1
 elif [ ${MINSTAYTIME} -eq 0 ];then
    sed -i '' -e "${ln_min},${ln_and}d" $1
 elif [ ${MAXSTAYTIME} -eq 1440 ];then
   sed -i '' -e "${ln_and},${ln_max}d" $1
 fi
 sed -i ""  -e "s|@minstaytime|${MINSTAYTIME}|g" -e "s|@maxstaytime|${MAXSTAYTIME}|g" $1

Ng

当需要从第N处匹配开始替换时,可以使用 /Ng:
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK

例:
sed 's/\"//g
将"删除.
echo "a,b,c d" |sed 's/,/\n/g'
将,(逗号)替换为换行符
a
b
c d
echo "a,b,c d" |sed 's/ /\n/g'
将空格替换为换行符
a,b,c
d

head + tail

http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html
在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

在文件最开始添加一行

header="abcd,cded,de,de,de"
filename="tempfile"
sed -i "1s/^/${header}\n/" ${filename}

一行里连用sed命令(使用-e)

sed -e s# \"# \'# g -e "s/^/(\'${address}\',&/g" -e 's/$/&),/g'

sed中使用变量

sed s# \"# \'# g -e "s/^/(\'${address}&/g"
sed "s# ^# ${address}&# g"

当用sed进行单引号替换时:(把单引号替换为双引号)

http://www.blogjava.net/xzclog/archive/2015/10/29/427970.html
sed 's/'"'"/'"''/g' test.file
分解为:
sed 's/'
" ' "
/
' " '
'/g' test

当然还可以使用下面这两种方法替换:
sed s# \'# \"# g testfile最外层使用# 分隔,里面使用转义单引号,转义双引号
sed "s/'/\"/g" testfile最外层使用双引号,里面使用单引号,转义双引号

双引号变单引号
sed s# \"# \'# g testfile

sed替换全部文件里某个字符

https://blog.csdn.net/kauu/article/details/1757325

sed -i "s/tableau_jp/tableau_sb/g" `grep tableau_jp -rl .`

替换当前路径下(.)所有tableau_jptableau_sb

如果是mac系统的话,
https://blog.csdn.net/shaw1994/article/details/20723431

grep -rl "str1" dir | xargs sed -i "" 's/str2/str3/g'

cut

writer: frozen_sucker
链接:http://blog.csdn.net/Frozen_fish/archive/2008/04/08/2260804.aspx

cut命令可以从一个文本文件或者文本流中提取文本列。
命令用法:

cut -b list [-n] [file ...]
cut -c list [file ...]
cut -f list [-d delim][-s][file ...]

上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);

list表示-b、-c、-f操作范围,-n常常表示具体数字;
file表示的自然是要操作的文本文件的名称;
delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
-s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)

上面三种方式中,表示从指定的范围中提取字节(-b)、或字符(-c)、或字段(-f)。
范围的表示方法:
n 只有第n项
n- 从第N项一直到行尾
n-m 从第N项到第m项(包括m)
-m 从一行的开始到第m项(包括m)

  • 从一行的开始到结束的所有项
    例:
    cut -d',' -f1以逗号分割,只取第一项

删除重复行

1.用sort+uniq
sort -n test.txt | uniq
2.
sort -u test.txt

compare two files

diff -y 3 $file1 $file2 

comm
来自: http://man.linuxde.net/comm
-1:不显示在第一个文件出现的内容;
-2:不显示在第二个文件中出现的内容;
-3:不显示同时在两个文件中都出现的内容。
cat aaa.txt
aaa
bbb
ccc
ddd
eee
111
222
cat bbb.txt
bbb
ccc
aaa
hhh
ttt
jjj
comm aaa.txt bbb.txt

aaa
				bbb
				ccc 
		aaa
ddd 
eee
111 
222
		hhh 
		ttt 
		jjj
第一列  第二列   第三列
	

输出的第一列只包含在aaa.txt中出现的行,第二列包含在bbb.txt中出现的行,第三列包含在aaa.txt和bbb.txt中相同的行。各列是以制表符(\t)作为定界符。

# 交集:打印两个文件的交集,需要删除第一列和第二列: 
comm $file1 $file2  -1 -2
# 求差 打印出两个文件中不相同的行,需要删除第三列
comm $file1 $file2 -3  | sed 's/^\t//'
# sed 's/^\t//' 是将制表符(\t)删除,以便把两列合并成一列

数值计算

http://blog.csdn.net/guodongxiaren/article/details/40370701
Bash中的数学运算并不如其他语言般简便,因为Bash把所有变量都视作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2。
运算符[ ]

    a=2  
    b=3  
    c=$[a+b]  
    d=$[a-b]  
    e=$[a*b]  
    f=$[a/b]  
    g=$[a%b]   

$符只是取变量值的意思。中括号和里面的表达式可以视作一个变量。在中括号中引用变量可以直接使用变量名,也可以使用$加变量名。比如:

c=$[$a+$b]

当然,你可以直接使用字面值:

    c=$[2+3]  
    d=$[2-3]  
    e=$[2*3]  
    f=$[2/3]  

需要注意的是:
该运算只支持整数,如果a或者b是小数,则会报错。运算结果是小数的也会自动取整。
该运算[ ]的操作符(±*/)和变量之间可以有空格。即可写作c=$[a + b]

PATH

1)export PATH=$PATH:xx/xx/xx

gedit ~/.bashrc
source ~/.bashrc

others
If permision denied->
chmod u+x *.sh

linux中shell变量$# ,$@,$0,$1,$2的含义解释:

$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*“用「”」括起来的情况、以"$1 $2 … n " 的形式输出所有参数。 ‘ ‘ ‘ n"的形式输出所有参数。 ``` n"的形式输出所有参数。‘‘‘@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 $# 添加到Shell的参数个数 $0 Shell本身的文件名 1 ~ 1~ 1n ```
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

字符

# ${}、# # 和%%

http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file# */}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file# # */}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file# *.}:删掉第一个 . 及其左边的字符串:file.txt
${file# # *.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上# 在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
字符长度:

file="abc.w"
${# file}

# 字符串截取

我想把某个字符串最右边三个数字去掉

name="abcd000"
name2=${name:0:${#name}-3}
echo $name2

http://www.111cn.net/sys/linux/43822.htm
1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:

str=‘http://www.你的域名.com/cut-string.html’

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:2、从左边第几个字符开始一直到结束,用法为:start,例如:

str=‘http://www.你的域名.com/cut-string.html’

echo ${var:7}

其中的 7 表示左边第8个字符开始
结果是:www.你的域名.com/cut-string.html3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:

str=‘http://www.你的域名.com/cut-string.html’
echo ${str:0-15:10}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:cut-string3、从右边第几个字符开始一直到结束,用法:0-start,例如:

str=‘http://www.你的域名.com/cut-string.html’
echo ${str:0-4}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:html注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

# 字符数组

http://snailwarrior.blog.51cto.com/680306/154704

SEASON=("Srping" "Summer" "Autumn" "Winter")

# 查看一下环境变量:
set | grep SEASON
# SEASON=([0]="Spring" [1]="Summer" [2]="Autumn" [3]="Winter")
 
# 显示整个数组:
echo ${SEASON[*]}  
echo ${SEASON[@]}
# Spring Summer Autumn Winter
 
# 显示某一数组元素:
echo ${SEASON[3]}
# Winter
 
# 给单个数组元素赋值:
SEASON[0]="New_Spring"
 
# 再查看一下看数组:
echo ${SEASON[*]}
# New_Spring Summer Autumn Winter
 
# 清除指定的单个数组元素:
unset SEASON[2]
 
# 清除整个数组:
unset SEASON

# 计算数组元素个数:
${# array[@]}  
${# array[*]}
 
# 遍历数组:
for var in ${SEASON[@]};do
echo $var
done 

sub function

# /bin/bash
function generate() {
	ID=$1
        CRI=$2
        # Number of hidden units of lstm
        HIDDEN_NUM=64
	 ...
}

ids=("2096" "6988")
# cris=("MSECriterion" "DistKLDivCriterion")
cris=("1" "2")
for id in ${ids[@]};do
        for cri in ${cris[@]};do
                generate $id $cri
        done
done

search path

# !/bin/bash
TRAIN_SVDIR=( \
    "/work1/t2g-//trecvid/features/LDC2012E01/Bottom_up_13k_one/" \
    "/work1/t2g-//trecvid/features/LDC2013E115/Bottom_up_13k_one/" \
    "/work1/t2g-//trecvid/features/LDC2011E41/Bottom_up_13k_one/" \
    "/work1/t2g-//trecvid/features/LDC2011E41/Bottom_up_13k_part1_one/" \
    "/work1/t2g-///features/LDC2011E41/Bottom_up_13k_part2_one/" \
    "/work1/t2g-shinoda2011//trecvid/features/LDC2011E41/Bottom_up_13k_part3_one/" \
)

ERROR=0
for CLIP in ` sed 's/\"//g' ${TRAIN_CLIPMD} | tail -n +2 | cut -d',' -f1 `
do
	E=1
	for DIR in ${TRAIN_SVDIR[@]} # for DIR in $TRAIN_SVDIR 
	do
		SV="$DIR/HVC${CLIP}${SVSUFFIX}"
		if [  -r $SV ];  then
			# do sth.
			break
		fi
	done
	if [  $E -eq "1" ];  then
		echo "HVC${CLIP}${SVSUFFIX} doesn't exist anywhere." >> error.log
		echo "HVC${CLIP}${SVSUFFIX} doesn't exist anywhere."
		ERROR=1
		exit -1
	fi
done

date日期

计算2019年3月的最后一天是几号。

Mac

https://stackoverflow.com/questions/498358/how-do-i-do-date-math-in-a-bash-script-on-os-x-leopard

date -j -f '%Y%m%d' -v+1m -v-1d 20190401 +%m%d

linux

LAST_DAY=`date -d 03/01/2019-1days+1month '+%d'`

linux 当前日期的前几天

#当前日期(今天)的3天前的日期
export YYYY=`date --date "3 days ago" +%Y`
export MM=`date --date "3 days ago" +%m`
export DD=`date --date "3 days ago" +%d`
YYYYMMDD=`date --date "3 days ago" +%Y%m%d`

linux特定日期的前后几天

#前一天
export YYYY=`date -d "20180901 1 days ago" "+%Y"`
export MM=`date -d "20180901 1 days ago" "+%m"`
export DD=`date -d "20180901 1 days ago" "+%d"`
export YYYYMMDD=`date -d "20180901 1 days ago" "+%Y%m%d"`
#第二天
export YYYYMMDD=`date -d "20180831 1 days" "+%Y%m%d"`

seq

seq -f %03g 3 7

会生成
003 004 005 006 007

seq -w 3 7

只会生成 3 4 5 6 7

但如果是

seq -w 8 11

会生成 08 09 10 11

判断字符串是否为空

https://www.cnblogs.com/cute/archive/2011/08/26/2154137.html

STRING=
if [ -z "$STRING" ]; then 
    echo "STRING is empty" 
fi

if [ -n "$STRING" ]; then 
    echo "STRING is not empty" 
fi
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值