一些实用的Linux命令

1.  以前经常想删除一些先前的trace File同时保留最新的File,苦思良久却无从下手,只好把所有的File一并删掉,诚惶诚恐。今天看见cut命令后顿时豁然开朗,相见恨晚啦!
    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)。

    其中,范围的表示方法为(M,N表示数字):
        N  只有第N项
        N-从第N项一直到行尾
        N-M 从第N项到第M项(包括M)
         -M从一行的开始到第M项(包括M)
        -从一行的开始到结束的所有项
    如:
        -c3          提取第3个字符
        -c3-         提取第3个字符以后的字符
        -c1,3,7  提取第1,3,12位置字符,数字之间用“,”符号隔开
        -c3-15     提取第3个字符到第15个字符间的字符

实例:
ubuntu/home/newuser/xujun>ll t*.txt
-rw-r--r--   1 rbmwsft1   rbmwsftp     57914 May  4 17:06 t1.txt
-rw-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09:37 t4.txt
-rw-r--r--   1 newuser    rbmwgp          66 May  5 09:37 tgb.txt
-rw-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10:52 t16.txt
-rw-r--r--   1 newuser    rbmwgp           0 May  5 10:52 t16gb.txt
-rw-r--r--   1 newuser    rbmwgp           0 May  5 16:13 t5.txt

ubuntu/home/newuser/xujun>ll t*.txt|cut -c3
w
w
w
w
w
w

ubuntu/home/newuser/xujun>ll t*.txt|cut -c3-
w-r--r--   1 rbmwsft1   rbmwsftp     57914 May  4 17:06 t1.txt
w-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09:37 t4.txt
w-r--r--   1 newuser    rbmwgp          66 May  5 09:37 tgb.txt
w-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10:52 t16.txt
w-r--r--   1 newuser    rbmwgp           0 May  5 10:52 t16gb.txt
w-r--r--   1 newuser    rbmwgp           0 May  5 16:13 t5.txt

ubuntu/home/newuser/xujun>ll t*.txt|cut -c1,3,5
-wr
-wr
-wr
-wr
-wr
-wr

ubuntu/home/newuser/xujun>ll t*.txt|cut -c'1 2 3'
-rw
-rw
-rw
-rw
-rw
-rw
(这里数字代表field,数字之间以空格分隔,分隔符会一并输出)

ubuntu/home/newuser/xujun>ll t*.txt|cut -b 1,2,3
-rw
-rw
-rw
-rw
-rw
-rw
(因为每个因为字符都占一个字节,所以这里看不出-c和-b的区别,当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开,如:cut -nb 1,2,3)

ubuntu/home/newuser/xujun>ll t*.txt|cut -b 1,6-7
---
---
---
---
---
---

ubuntu/home/newuser/xujun>ll t*.txt|cut -b 46-54
May  4 17
May  5 09
May  5 09
May  5 10
May  5 10
May  5 16

ubuntu/home/newuser/xujun>ll t*.txt|cut -d: -f1
-rw-r--r--   1 rbmwsft1   rbmwsftp     57914 May  4 17
-rw-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09
-rw-r--r--   1 newuser    rbmwgp          66 May  5 09
-rw-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10
-rw-r--r--   1 newuser    rbmwgp           0 May  5 10
-rw-r--r--   1 newuser    rbmwgp           0 May  5 16

ubuntu/home/newuser/xujun>ll t*.txt|cut -d ' ' -f 5
rbmwsft1
rbmwsft1
newuser
rbmwsft1
newuser
newuser
(如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。另外,sed -n l 命令可查看field之间到底是空格还是tab键,tab键以/t显示)

现在我们再回过头来看看如何删除指定日期的文件,要想删除这些文件必定要先取其文件名,前面的例子我们已经 取出了时间,料想取出文件名我们只须沿用此法就好了。
for line in $(ll t*.txt|cut -c 46-48,51,59-)
do
  if [ $(print $line|cut -c1-4) = "May4" ]
  then
    rm $(print $line|cut -c5-)
  fi
done
(注:时间和文件名的位置需根据时间情况对待)

 


2. xargs-从标准输出建立并运行命令行
example1
描述:输出当前目录下所有符号链接或经过压缩的ASCII文件并显示
命令:file -Lz * | grep ASCII | cut -f1 -d: | xargs ls -ltr
解释:
file -Lz *:用于查找是符号链接或者经过压缩的文件;
输出结果:
anaconda-ks.cfg:    ASCII English text
install.log:               ASCII text
insall.log.syslog:     ASCII text
mbox:                      ASCII mail text

grep ASCII:用于搜索包含 "ASCII" 字符的字符串并产生;
输出结果:
anaconda-ks.cfg:    ASCII English text
install.log:               ASCII text
insall.log.syslog:     ASCII text
mbox:                      ASCII mail text

cut -f1 -d:表示采用冒号作为分隔符,并取出第一列。所以尽显示文件名;
输出结果:
anaconda-ks.cfg
install.log
install.log.syslog
mbox

xargs:将上述列表作为参数进行传递,一次传递一个。
xargs ls -ltr:用于接收输出并对其执行 ls -ltr 命令,命令等价于:
ls -ltr anaconda-ks.cfg
ls -ltr install.log
ls -ltr install.log.syslog
ls -ltr mbox

结果大家应该都知道了吧。
xargs 本身虽然没有多大用处,但在与其他命令相结合时,它的功能非常强大。

example2
描述:计算当前目录下各个文件行数:
命令:file * | grep ASCII | cut -f1 -d: | xargs wc -l
解释:(无)
结果:
        40 anaconda-ks.cfg
      452 install.log
        53 install.log.syslog
        68 mbox
      613 total

example3
描述:用vi打开匹配后的文件
命令:file * | grep ASCII | cut -f1 -d: | xargs vi
解释:
该命令使用 vi 逐个打开文件。当您希望搜索多个文件并打开它们进行编辑时,使用该命令非常方便。

example4
描述:快速重命名目录中的文件。
命令:ls | xargs -i mv {} {}.old
解释:
-i 选项告诉 xargs 用每项的名称替换 {}。

xargs还有几个选项:
-p 选项;它使操作具有可交互性:
命令: file * | grep ASCII | cut -f1 -d: | xargs -p vi
此处的 xarg 要求您在运行每个命令之前进行确认。如果您按下 "y",则执行命令。

-t 选项;使用一个详细模式,显示要运行的命令,是调试过程中一个非常有帮助的选项。

如果传递给 xargs 的输出为空怎么办?考虑以下命令:

命令:file * | grep 12345 | cut -f1 -d: | xargs -t wc -l
wc -l
        0
此处,搜索 "12345" 后没有匹配的内容;因此 xargs 的输入均为空,如第二行所示(由于我们使用 -t 这个详细选项而产生的结果)。

-r选项;虽然这可能会有所帮助,但在某些情况下,如果没有要处理的内容,您可能希望停止 xargs;如果是这样,可以使用 -r 选项:
命令: file * | grep 12345 | cut -f1 -d: | xargs -t -r wc -l
如果没有要运行的内容,该命令退出。

-n选项;修改单个命令行传递的参数个数。例如我们即使向 xargs ls -ltr 传递五个文件,但每次向 ls -ltr 仅传递两个文件。
命令:file * | grep ASCII | cut -f1 -d: | xargs -t -n2 ls -ltr

 


3. iconv命令
    Linux 下的 iconv 命令可以来处理字符编码的转换,基本命令格式如下:
    iconv -f fromcode -t tocode [file ...]
    -f 代表 from,-t 代表 to。
    其中fromcode 和 tocode可以代表iconv配置文件中的所有编码基名或者别名,该配置文件位于/usr/lib/nls/iconv/config.iconv
        ubuntu/usr/lib/nls/iconv>grep utf8 config.iconv
        alias utf8 UTF8 UTF-8
        ucs2    utf8    -               lucs2utf.sl     -
        utf8    ucs2    -               lutfucs2.sl     -
        ucs4    utf8    -               lucs4utf.sl     -
        utf8    ucs4    -               lutfucs4.sl     -
        vroma8   utf8    roma8=ucs2      lsbutf8.sl      -
        iso81   utf8    iso81=ucs2      lsbutf8.sl      -
        ------------------------------------------------------
   事实上,我们用locale -a命令可以查看当前系统中所有可用的字符集。
   如:
   ubuntu/home/newuser/xujun>locale -a|grep gb
   zh_CN.gb18030

   以下实例将utf8格式的文件转换为gb8030
       iconv -f utf8 -t gb18030 t16.txt > t16gb.txt

    在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。
一、利用iconv函数族进行编码转换
iconv函数族的头文件是iconv.h,使用前需包含之。
#include <iconv.h>
iconv函数族有三个函数,原型如下:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。


(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。

用C++语言实现的转换示例程序

/* f.cpp : 代码转换示例C++程序 */
#include <iconv.h>
#include <iostream>

#define OUTLEN 255

using namespace std;

// 代码转换操作类
class CodeConverter {
private:
iconv_t cd;
public:
// 构造
CodeConverter(const char *from_charset,const char *to_charset) {
cd = iconv_open(to_charset,from_charset);
}

// 析构
~CodeConverter() {
iconv_close(cd);
}

// 转换输出
int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
char **pin = &inbuf;
char **pout = &outbuf;

memset(outbuf,0,outlen);
return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
}
};

int main(int argc, char **argv)
{
char *in_utf8 = "姝e?ㄥ??瑁?";  //此处应将源文件保存为utf8格式。
char *in_gb2312 = "正在安装";    //此处应将源文件保存为gb2312格式。
char out[OUTLEN];

// utf-8-->gb2312
CodeConverter cc = CodeConverter("utf-8","gb2312");
cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);
cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;

// gb2312-->utf-8
CodeConverter cc2 = CodeConverter("gb2312","utf-8");
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl;
}

 


4. awk命令
awk是一种用于处理数据和生成报告的编程语言。
一般的使用格式是:
awk '{pattern + action}' {filenames}
pattern指在每一行中进行匹配的条件,action指针对符合条件的行进行的操作,filenames是输入的文件名。
    我们还是以先前第1例中获取特定日期的文件名为例
ubuntu/home/newuser/xujun>ll t*.txt
-rw-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09:37 t4.txt
-rw-r--r--   1 newuser    rbmwgp          66 May  5 09:37 tgb.txt
-rw-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10:52 t16.txt
-rw-r--r--   1 newuser    rbmwgp           0 May  5 10:52 t16gb.txt
-rw-r--r--   1 newuser    rbmwgp           0 May  5 16:13 t5.txt
-rw-r--r--   1 newuser    rbmwgp           0 Jun  1 16:02 t6.txt
-rw-r--r--   1 newuser    rbmwgp           0 Jun  1 16:02 t7.txt

a. 提取指定列的数据
ubuntu/home/newuser/xujun>ll t*.txt | awk '{ print $6,$7 }'
May 5
May 5
May 5
May 5
May 5
Jun 1
Jun 1

b. 格式化输出
ubuntu/home/newuser/xujun>ll t*.txt | awk '{ print $6"/t",$7 }'    
May      5
May      5
May      5
May      5
May      5
Jun      1
Jun      1

c. 加提取条件
ubuntu/home/newuser/xujun>ll t*.txt| awk '/Jun  1/ { print $9 }'
t6.txt
t7.txt
此处我们提取日期为“Jun  1”的文件名,一步到位。此时我们想删除这些文件,易如反掌,哈哈~~~

多个条件以“|”分隔,
ubuntu/home/newuser/xujun>ll t*.txt| awk '/Jun  1|110/ { print $9 }'
t16.txt
t6.txt
t7.txt
这里的"|"应该是或的作用,而不是管道

d. 正则表达式的应用
ubuntu/home/newuser/xujun>ll t*.txt | awk '/t[46]/ { print $9 }'
t4.txt
t6.txt

e. 计算后输出
ubuntu/home/newuser/xujun>ll t*.txt | awk '/t[46]/ { print $7+1,$9 }'
6 t4.txt
2 t6.txt
(第7域加1)

ubuntu/home/newuser/xujun>ll t*.txt | awk '/t[46]/ { print $3, $9 } { print $7+1 }'
rbmwsft1 t4.txt
6
6
6
6
6
newuser t6.txt
2
2
(匹配只对第一个花括号有用,由结果我们不难看出满足t*.txt的所有输出行第7域均加了1)

g. 使用"n"而不是空格做为分隔符
ubuntu/home/newuser/xujun>ll t*.txt | awk 'FS="n" { print $1 } '
-rw-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09:37 t4.txt
-rw-r--r--   1 newuser    rbmwgp          66 May  5 09:37 tgb.txt
-rw-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10:52 t16.txt
-rw-r--r--   1 newuser    rbmwgp           0 May  5 10:52 t16gb.txt
-rw-r--r--   1 newuser    rbmwgp           0 May  5 16:13 t5.txt
-rw-r--r--   1 newuser    rbmwgp           0 Ju
-rw-r--r--   1 newuser    rbmwgp           0 Ju

h. 加分隔符输出
ubuntu/home/newuser/xujun>ll t*.txt | awk 'FS="n" { OFS = "*" } { print $1,$2 }'
-rw-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09:37 t4.txt*
-rw-r--r--   1 newuser    rbmwgp          66 May  5 09:37 tgb.txt*
-rw-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10:52 t16.txt*
-rw-r--r--   1 newuser    rbmwgp           0 May  5 10:52 t16gb.txt*
-rw-r--r--   1 newuser    rbmwgp           0 May  5 16:13 t5.txt*
-rw-r--r--   1 newuser    rbmwgp           0 Ju*  1 16:02 t6.txt
-rw-r--r--   1 newuser    rbmwgp           0 Ju*  1 16:02 t7.txt

i. 加行号输出
ubuntu/home/newuser/xujun>ll t*.txt | awk 'FS="n" { OFS = "*" } { print NR, $1,$2 }'
1*-rw-r--r--   1 rbmwsft1   rbmwsftp        73 May  5 09:37 t4.txt*
2*-rw-r--r--   1 newuser    rbmwgp          66 May  5 09:37 tgb.txt*
3*-rw-r--r--   1 rbmwsft1   rbmwsftp       110 May  5 10:52 t16.txt*
4*-rw-r--r--   1 newuser    rbmwgp           0 May  5 10:52 t16gb.txt*
5*-rw-r--r--   1 newuser    rbmwgp           0 May  5 16:13 t5.txt*
6*-rw-r--r--   1 newuser    rbmwgp           0 Ju*  1 16:02 t6.txt
7*-rw-r--r--   1 newuser    rbmwgp           0 Ju*  1 16:02 t7.txt

j. 使用变量进行累加计算
ubuntu/home/newuser/xujun>ll t*.txt | awk '{ x = x + $7 } { print NR,$7,x }'
1 5 5
2 5 10
3 5 15
4 5 20
5 5 25
6 1 26
7 1 27

K. 使用管道进行排序
ubuntu/home/newuser/xujun>ll t*.txt | awk '{ x = x + $7 } { print NR,$7,x| "sort -nr" }'
7 1 27
6 1 26
5 5 25
4 5 20
3 5 15
2 5 10
1 5 5

 

 

5. sort命令
    sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。
    Sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。

    语法:
    sort [选项] 文件
    说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“- ”,则表示排序内容来自标准输入。
sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

    改变缺省设置的选项主要有:
        - m 若给定文件已排好序,合并文件。
        - c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出
        - u 对排序后认为相同的行只留其中一行。
        - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先        将该文件的内容写入一个临时文件,然后再排序和写输出结果。

    改变缺省排序规则的选项主要有:
        - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。
        - f 将小写字母与大写字母同等对待。
        - I 忽略非打印字符。
        - M 作为月份比较:“JAN”<“FEB”
        - r 按逆序输出排序结果。
    +posl - pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。
- b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。
- t separator 指定字符separator作为字段分隔符。

 

 

6. tr命令
     格式:tr SET1 SET2
    凡是在SET1中的字符,都会被替换为SET2中相应位置上的字符。tr命令不接受指定的文件参数,而只是对标准输入进行翻译。
ubuntu/home/newuser/xujun>cat in.txt
dfdafd
ffaf
faljd
fdfjdjd
dffss

ubuntu/home/newuser/xujun>tr fd df < in.txt
fdfadf
ddad
daljf
dfdjfjf
fddss
将所有的f替换为d,d替换为f。注意:tr命令只是对标准输入进行翻译,并没有改变原始文件。

ubuntu/home/newuser/xujun>tr fd g< in.txt
dgdagd
ggag
galjd
gdgjdjd
dggss
将f替换为g,d并没有被替换。

ubuntu/home/newuser/xujun>cat in.txt
abcdefghijk

ubuntu/home/newuser/xujun>tr 'a-z' 'A-Z' < in.txt
ABCDEFGHIJK
将所有的小写字母替换为大写字母

ubuntu/home/newuser/xujun>tr 'a-f' '[A*]' <in.txt
AAAAAAghijk
将字符a-f全部用A替换掉。

ubuntu/home/newuser/xujun>tr 'a-f' '[A*3]BCD' < in.txt
AAABCDghijk
将a-c用A替换,d-f分别用B、C、D替换

ubuntu/home/newuser/xujun>cat in.txt
You   are   welcome!

ubuntu/home/newuser/xujun>tr -s ' ' ' ' <in.txt
You are welcome!
"s"选项可缩减相同字符

ubuntu/home/newuser/xujun>tr -d ' ' <in.txt
Youarewelcome!
"d"选项看删除指定字符。

你可能感兴趣的:(linux,正则表达式,list,File,character,filenames)