【linux】文字提取
2015-06-03 22:26
453 查看
提取IP地址:
方法①:
ifconfig: 显示或配置网络设备的命令 后面跟的是设备名。
ifconfig eth3 的显示如下:
grep: 后面接正则表达式,显示正则表达式出现的行
ifconfig eth3|grep Bcast的显示为:
cut: -d 后面接分割符 -f后面的数字表示要获取分割后的第几个数据
ifconfig eth3|grep Bcast|cut -d ":" -f2 后显示为:
ifconfig eth3|grep Bcast|cut -d ":" -f2|cut -d " " -f1 后就获取了ip地址
awk小例子
来自/article/6135444.html
①输出文件中包含符合某正则表达式的行
awk '/111*/' text 输出text文件中包含符合111* 字段的行
②输出文件中每行的第n个字段
awk '{print $1}' text 输出text文件中每行的第一个字段 $0表示全部
awk '{print $1,$3}' text 输出text文件中每行的第一和第三个字段 空格分隔
awk '/111*/{print $1,$3}' text 输出text文件中有符合111*字段行的第一和第三个字段
tr:
来自http://blog.sina.com.cn/s/blog_58c3f7960100uttl.html
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
例子
1、
cat file | tr "abc" "xyz" > new_file
【注意】这里,凡是在file中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。
2、使用tr命令“统一”字母大小写
(小写 --> 大写)
# cat file | tr [a-z] [A-Z] > new_file
(大写 --> 小写)
# cat file | tr [A-Z] [a-z] > new_file
3、把文件中的数字0-9替换为a-j
# cat file | tr [0-9] [a-j] > new_file
4、删除文件file中出现的"Snail"字符
# cat file | tr -d "Snail" > new_file
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。
5、删除文件file中出现的换行'\n'、制表'\t'字符
# cat file | tr -d "\n\t" > new_file
不可见字符都得用转义字符来表示的,这个都是统一的。
6、删除“连续着的”重复字母,只保留第一个
# cat file | tr -s [a-zA-Z] > new_file
7、删除空行
# cat file | tr -s "\n" > new_file
8、删除Windows文件“造成”的'^M'字符
# cat file | tr -d "\r" > new_file
或者
# cat file | tr -s "\r" "\n" > new_file
【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者
9、用空格符\040替换制表符\011
# cat file | tr -s "\011" "\040" > new_file
10、把路径变量中的冒号":",替换成换行符"\n"
# echo $PATH | tr -s ":" "\n"
sort:
来自/article/5807920.html
sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:
sort [-bcfMnrtk][源文件][-o 输出文件]
补充说明:sort可针对文本文件的内容,以行为单位来排序。
参 数:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-f 排序时,忽略大小写字母。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序。
uniq:
来自:http://blog.csdn.net/jesseen/article/details/8005056
用途:报告或删除文件中重复的行。
语法
uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ -Fields ] [ +Characters ] [ InFile [ OutFile ] ]
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
例子:
echo "a is a b is b"|tr -s ' ' '\n'|uniq -c
结果为:
[b]综合应用:[/b]
Write a bash script to calculate the frequency of each word in a text file
For simplicity sake, you may assume:
Each word must consist of lowercase characters only.
Words are separated by one or more whitespace characters.
For example, assume that
Your script should output the following, sorted by descending frequency:
方法一:
解答:为了方便使用sort函数,首先要把每个字符串单独放在一行 要用tr, 然后用sort排序,用uniq统计每个单词的数量,再用sort按照数量排序,最后用awk按格式输出。
cat words.txt | tr -s ' ' '\n'|sort|uniq -c|sort -nr|awk '{print $2,$1}'
方法二:只用awk
awk '\
{ for (i=1; i<=NF; i++) { ++D[$i]; } }\
END { for (i in D) { print i, D[i] } }\
' words.txt | sort -nr -k 2
awk原理:来自/article/6135444.html
1):awk使用一行作为输入,并将这一行赋给内部变量$0,默认时每一行也可以称为一个记录,以换行符结束。
2):然后,行被空格分解成字段,每一个字段存储在已编号的变量中,从$1开始,可以多达100个字段。
3):awk如何知道空格是用来分隔字段的呢?因为有另一个内部变量FS用来确定字段的分隔符。初始时,FS被赋为空格——包含制表符和空格符。如果需要使用其他的字符分隔符,如冒号或破折号,则需要将FS变量的值设为新的字段分隔符。
4):awk打印字段时,将以下面的方式使用print函数:{print $1,$3};逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格。逗号被OFS变量中存储的字符替换。
5):awk输出之后,将从文件中获取另一行,并将其存储到$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。这个过程将持续到整个文件的所有行都处理完毕。
转义序列:转义序列用一个反斜杠后跟一个字母或数字来表示。它们可以用在字符串中,代表制表符,换行符,换页符等。
5:awk '/zhangfei/{print "\t\twu hu shangjiang:" $1,$2 "!"}'
wu hu shangjiang:zhangfei xiuhua!
\t:制表符,tab键
6.打印数字时,可能需要控制数字的格式。这可以通过printf函数来实现,但是,通过设置一个特殊的awk变量OFMT,使用print函数时也可以控制数字的打印格式。OFMT的默认值时“%.6gd",表示只打印小数部分的前六位。
awk 'BEGIN{OFMT="%.2f";print 1.23456789,12E-2}'
1.23 0.12
如果设置了变量OFMT,在打印浮点数时,就只打印小数部分的前两位。百分号表示接下来要定义格式。
BEGIN:必须大写
7:
1):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%-15s|\n",$1}'
|UNIX |
2):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%15s|\n",$1}'
| UNIX|
1): 对于echo命令的输出,unix是经管道发给awk。printf函数包含一份控制串。百分号让printf做好准备,它要打印一个占15非格,向左对 齐的字符串,这个字符串夹在两个竖杠之间,并且以换行符结尾。百分号后的短划线表示左对齐。控制穿后面跟了一个逗号和$1。printf将根据控制串中的 格式说明来格式化字符串unix。
2):字符串unix被打印成一个占15格,向右对齐的字符串,夹在两个竖杠之间,以换行符结尾。
8.[root@localhost tmp]# awk '{printf "The name is: %-15s ID is: %-15d Money is: %-15d\n",$1,$2,$3}' liuguanzhang
The name is: liubei ID is: 1 Money is: 10000
The name is: guanyu ID is: 2 Money is: 2000
The name is: zhangfei ID is: 3 Money is: 1000
9.[root@localhost tmp]# awk '{printf "|%-15s| %-15s| %-15s\n",$1,$2,$3}' liuguanzhang
|liubei | 1 | 10000
|guanyu | 2 | 2000
|zhangfei | 3 | 1000
10:root@localhost tmp]# awk '{max=($1>$2)?$1:$2;print max}' filename
如果记录的第一个字段的值大于第二个字段的值,则把问号后面那个表达式的值赋给max,否则就将冒号后面的那个表单时的赋给max。
11:awk -F: 'NF != 7{printf("line %d,does not have 7 fields: %s\n",NR,$0)} $1 !~/[A-Za-z0-9]/{printf("line %d,nonalphanunmeric user id: %s\n",NR,$0)} $2=="*"{printf("line %d,no password:%s\n",NR,$0)}' passwd
awk的字段分隔 符是冒号;如果字段数(NF)不等于7,则执行接下来的操作块;printf函数打印字符串“line<行号>,does not have 7 fields:”,后面跟上当前记录的记录号(NR)和记录本身($0);如果第一个字段($1)中不含任何字母和数字字符,printf函数就打印字符 串“nonalphanumberic user id:”,后面跟上当前记录的记录号和内容;如果第二个字段是一个星号,就打印字符串“no passwd:",后面跟上记录号和记录本身.
12:awk -F: '/Nancy McNeil/{$1="Louise Mclnnes";print $0}' test
方法①:
ifconfig eth3|grep Bcast|cut -d ":" -f2|cut -d " " -f1
ifconfig: 显示或配置网络设备的命令 后面跟的是设备名。
ifconfig eth3 的显示如下:
grep: 后面接正则表达式,显示正则表达式出现的行
ifconfig eth3|grep Bcast的显示为:
cut: -d 后面接分割符 -f后面的数字表示要获取分割后的第几个数据
ifconfig eth3|grep Bcast|cut -d ":" -f2 后显示为:
ifconfig eth3|grep Bcast|cut -d ":" -f2|cut -d " " -f1 后就获取了ip地址
awk小例子
来自/article/6135444.html
①输出文件中包含符合某正则表达式的行
awk '/111*/' text 输出text文件中包含符合111* 字段的行
②输出文件中每行的第n个字段
awk '{print $1}' text 输出text文件中每行的第一个字段 $0表示全部
awk '{print $1,$3}' text 输出text文件中每行的第一和第三个字段 空格分隔
awk '/111*/{print $1,$3}' text 输出text文件中有符合111*字段行的第一和第三个字段
tr:
来自http://blog.sina.com.cn/s/blog_58c3f7960100uttl.html
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
例子
1、
cat file | tr "abc" "xyz" > new_file
【注意】这里,凡是在file中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。
2、使用tr命令“统一”字母大小写
(小写 --> 大写)
# cat file | tr [a-z] [A-Z] > new_file
(大写 --> 小写)
# cat file | tr [A-Z] [a-z] > new_file
3、把文件中的数字0-9替换为a-j
# cat file | tr [0-9] [a-j] > new_file
4、删除文件file中出现的"Snail"字符
# cat file | tr -d "Snail" > new_file
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。
5、删除文件file中出现的换行'\n'、制表'\t'字符
# cat file | tr -d "\n\t" > new_file
不可见字符都得用转义字符来表示的,这个都是统一的。
6、删除“连续着的”重复字母,只保留第一个
# cat file | tr -s [a-zA-Z] > new_file
7、删除空行
# cat file | tr -s "\n" > new_file
8、删除Windows文件“造成”的'^M'字符
# cat file | tr -d "\r" > new_file
或者
# cat file | tr -s "\r" "\n" > new_file
【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者
9、用空格符\040替换制表符\011
# cat file | tr -s "\011" "\040" > new_file
10、把路径变量中的冒号":",替换成换行符"\n"
# echo $PATH | tr -s ":" "\n"
sort:
来自/article/5807920.html
sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:
sort [-bcfMnrtk][源文件][-o 输出文件]
补充说明:sort可针对文本文件的内容,以行为单位来排序。
参 数:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-f 排序时,忽略大小写字母。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序。
uniq:
来自:http://blog.csdn.net/jesseen/article/details/8005056
用途:报告或删除文件中重复的行。
语法
uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ -Fields ] [ +Characters ] [ InFile [ OutFile ] ]
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
例子:
echo "a is a b is b"|tr -s ' ' '\n'|uniq -c
结果为:
[b]综合应用:[/b]
Write a bash script to calculate the frequency of each word in a text file
words.txt.
For simplicity sake, you may assume:
words.txtcontains only lowercase characters and space
' 'characters.
Each word must consist of lowercase characters only.
Words are separated by one or more whitespace characters.
For example, assume that
words.txthas the following content:
the day is sunny the the the sunny is is
Your script should output the following, sorted by descending frequency:
the 4 is 3 sunny 2 day 1
方法一:
解答:为了方便使用sort函数,首先要把每个字符串单独放在一行 要用tr, 然后用sort排序,用uniq统计每个单词的数量,再用sort按照数量排序,最后用awk按格式输出。
cat words.txt | tr -s ' ' '\n'|sort|uniq -c|sort -nr|awk '{print $2,$1}'
方法二:只用awk
awk '\
{ for (i=1; i<=NF; i++) { ++D[$i]; } }\
END { for (i in D) { print i, D[i] } }\
' words.txt | sort -nr -k 2
awk原理:来自/article/6135444.html
1):awk使用一行作为输入,并将这一行赋给内部变量$0,默认时每一行也可以称为一个记录,以换行符结束。
2):然后,行被空格分解成字段,每一个字段存储在已编号的变量中,从$1开始,可以多达100个字段。
3):awk如何知道空格是用来分隔字段的呢?因为有另一个内部变量FS用来确定字段的分隔符。初始时,FS被赋为空格——包含制表符和空格符。如果需要使用其他的字符分隔符,如冒号或破折号,则需要将FS变量的值设为新的字段分隔符。
4):awk打印字段时,将以下面的方式使用print函数:{print $1,$3};逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格。逗号被OFS变量中存储的字符替换。
5):awk输出之后,将从文件中获取另一行,并将其存储到$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。这个过程将持续到整个文件的所有行都处理完毕。
转义序列:转义序列用一个反斜杠后跟一个字母或数字来表示。它们可以用在字符串中,代表制表符,换行符,换页符等。
5:awk '/zhangfei/{print "\t\twu hu shangjiang:" $1,$2 "!"}'
wu hu shangjiang:zhangfei xiuhua!
\t:制表符,tab键
6.打印数字时,可能需要控制数字的格式。这可以通过printf函数来实现,但是,通过设置一个特殊的awk变量OFMT,使用print函数时也可以控制数字的打印格式。OFMT的默认值时“%.6gd",表示只打印小数部分的前六位。
awk 'BEGIN{OFMT="%.2f";print 1.23456789,12E-2}'
1.23 0.12
如果设置了变量OFMT,在打印浮点数时,就只打印小数部分的前两位。百分号表示接下来要定义格式。
BEGIN:必须大写
7:
1):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%-15s|\n",$1}'
|UNIX |
2):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%15s|\n",$1}'
| UNIX|
1): 对于echo命令的输出,unix是经管道发给awk。printf函数包含一份控制串。百分号让printf做好准备,它要打印一个占15非格,向左对 齐的字符串,这个字符串夹在两个竖杠之间,并且以换行符结尾。百分号后的短划线表示左对齐。控制穿后面跟了一个逗号和$1。printf将根据控制串中的 格式说明来格式化字符串unix。
2):字符串unix被打印成一个占15格,向右对齐的字符串,夹在两个竖杠之间,以换行符结尾。
8.[root@localhost tmp]# awk '{printf "The name is: %-15s ID is: %-15d Money is: %-15d\n",$1,$2,$3}' liuguanzhang
The name is: liubei ID is: 1 Money is: 10000
The name is: guanyu ID is: 2 Money is: 2000
The name is: zhangfei ID is: 3 Money is: 1000
9.[root@localhost tmp]# awk '{printf "|%-15s| %-15s| %-15s\n",$1,$2,$3}' liuguanzhang
|liubei | 1 | 10000
|guanyu | 2 | 2000
|zhangfei | 3 | 1000
10:root@localhost tmp]# awk '{max=($1>$2)?$1:$2;print max}' filename
如果记录的第一个字段的值大于第二个字段的值,则把问号后面那个表达式的值赋给max,否则就将冒号后面的那个表单时的赋给max。
11:awk -F: 'NF != 7{printf("line %d,does not have 7 fields: %s\n",NR,$0)} $1 !~/[A-Za-z0-9]/{printf("line %d,nonalphanunmeric user id: %s\n",NR,$0)} $2=="*"{printf("line %d,no password:%s\n",NR,$0)}' passwd
awk的字段分隔 符是冒号;如果字段数(NF)不等于7,则执行接下来的操作块;printf函数打印字符串“line<行号>,does not have 7 fields:”,后面跟上当前记录的记录号(NR)和记录本身($0);如果第一个字段($1)中不含任何字母和数字字符,printf函数就打印字符 串“nonalphanumberic user id:”,后面跟上当前记录的记录号和内容;如果第二个字段是一个星号,就打印字符串“no passwd:",后面跟上记录号和记录本身.
12:awk -F: '/Nancy McNeil/{$1="Louise Mclnnes";print $0}' test
相关文章推荐
- linux命令---查找文件中的内容
- SDCC Linux编译
- Linux最常用的20条命令
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- Linux定时器分析-源码sample
- centos 6.5 重启后无法联网,找不到网卡驱动,直接在内核源码编译
- linux gdb调试笔记
- 解决CDLinux在笔记本电脑上启动花屏问题
- Linux内核进程创建do_fork()解析
- tar备份工具 Linux
- linux入门基础——linux用户基础
- linux僵尸进程
- Linux下构造函数string需要注意的问题
- linux(centos)搭建svn