zoukankan      html  css  js  c++  java
  • 【linux】文字提取

    提取IP地址

    方法①:

    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小例子

    来自http://www.cnblogs.com/xupeizhi/archive/2012/07/23/2605371.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中出现的换行' '、制表' '字符
     
    # cat file | tr -d " " > new_file
     
    不可见字符都得用转义字符来表示的,这个都是统一的。
     
    6、删除“连续着的”重复字母,只保留第一个
     
    cat file | tr -s [a-zA-Z] > new_file
     
    7、删除空行
     
    # cat file | tr -s " " > new_file
     
    8、删除Windows文件“造成”的'^M'字符
     
    # cat file | tr -d " " > new_file
    或者
    # cat file | tr -s " " " " > new_file
     
    【注意】这里-s后面是两个参数" "和" ",用后者替换前者
     
    9、用空格符40替换制表符11
     
    # cat file | tr -s "11" "40" > new_file
     
    10、把路径变量中的冒号":",替换成换行符" "
     
    # echo $PATH | tr -s ":" " "

    sort:

    来自http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.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 ' ' ' '|uniq -c
    结果为:
     

    综合应用:

    Write a bash script to calculate the frequency of each word in a text file words.txt.

    For simplicity sake, you may assume:

    • words.txt contains 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.txt has 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 ' ' ' '|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原理:来自http://www.cnblogs.com/xupeizhi/archive/2012/07/23/2605371.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 " wu hu shangjiang:" $1,$2 "!"}'

    wu hu shangjiang:zhangfei xiuhua!

    :制表符,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| ",$1}'
             |UNIX           |
    2):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%15s| ",$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 ",$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 ",$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 ",NR,$0)} $1 !~/[A-Za-z0-9]/{printf("line %d,nonalphanunmeric user id: %s ",NR,$0)} $2=="*"{printf("line %d,no password:%s ",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

  • 相关阅读:
    [o] SQLite数据库报错: Invalid column C
    startActivityForResult和setResult详解
    [o] duplicate column name: _id 问题解决
    [O] SQLite数据库报错:no such column
    [原创] SQLite数据库使用清单(下)
    [原创] SQLite数据库使用清单(上)
    iOS CocoaPods详解之 Analyzing dependencies
    iOS UILabe的详细使用及特殊效果
    一个简单的socket通信小demo
    iOS Lable给文字添加中划线和下划线
  • 原文地址:https://www.cnblogs.com/dplearning/p/4550466.html
Copyright © 2011-2022 走看看