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"选项看删除指定字符。