📄 readinfo
字号:
#!/bin/sh# @(#) readinfo 1.3 92/08/31 @(#)# reads a host database file## input from stdin# output to stdout## arguments are names of fields in the file## fields in a file are defined by a comment line of the form# #FIELDS <field_description> ...## where <field_description> is the name of the field followed by optional# keyword parameters of the form parameter=<value># three paramaters are supported in this script# prefix - prefix added to value of the field# suffix - suffix added to value of field# no - character to prevent adding a prefix or suffix to a field## fields in the file are separated with white space. Embedded blanks in fields# are either escaped with a '\' or the entire field is quoted with double quotes# The prefix or suffix can be overridden by prepending or following the value# with the ``no='' character# Copyright (c) 1992 by Texas Internet Consulting# This code may be freely copied and used so long as this# copyright notice is attached. This code may not be sold# without the express written permission of Texas Internet Consulting.# Texas Internet Consulting makes no warranty as to the correctness# nor the applicability of this code for any purpose.# get the fields from the command line - will be funnelled to awkfields="$*"# change whitespace to tabs and handle quoted fields and escaped blanks# also remove comment lines, except the #FIELDS lineawk 'BEGIN { # get around double quote bug dq = sprintf("%c", 34)}/^#FIELDS/ || ( ! /^#/ && ! /^$/ && ! /^[ ][ ]*/ ) {# line has double quotes or backslashes if ($0 ~ /"/ || $0 ~ /\\/) { # print everything up to field with double quote or backslash l = length($0) n = 0 for (i=1; i<=NF; i++) { if ($i !~ /"/ && $i !~ /\\/) { printf("%s\t", $i) } n += length($i) n++ } remainder = substr($0, n+1, l-n) l -= n quoted = 0 escaped = 0 for (i=1; i<=l; i++) { sub = substr(remainder, i, 1) if (sub == dq) { if (quoted) { quoted = 0 } else { quoted = 1 } } else if (sub == "\\") { escaped = 1 } else if (quoted) { printf("%s", sub) } else if (escaped) { printf("%s", sub) escaped = 0 } else if (sub == " ") { printf("\t") } else { printf("%s", sub) } } } # line is just a bunch of normal fields else { for (i=1; i<=NF; i++) { printf("%s", $i) if (i < NF) { printf("\t") } } } printf("\n")}' |# read file and output fields wantedawk -F' ' '# get the fields from the command lineBEGIN { EXTRACT="'"$fields"'" nextract = split(EXTRACT, extract, " ")}# extract field definition info from file/^#FIELDS/ { nfields = 0 for (i=2; i<=NF; i++) { # field is a paramter if ($i ~ /\=/) { n = split($i, part, "=") keyword = part[1] value = part[2] # prefix if (keyword == "prefix") { prefix[nfields] = value } # suffix else if (keyword == "suffix") { suffix[nfields] = value } else if (keyword == "no") { no[nfields] = value } } #field name else { nfields++ fields[nfields] = $i prefix[nfields] = "" suffix[nfields] = "" no[nfields] = "" } }}# process a record! /^#/ && ! /^$/ && ! /^[ ][ ]*/ { # scan the list of fields to extract and compare them with the # list in the file and print as they are encountered for (i=1; i<=nextract; i++) { for (j=1; j<=nfields; j++) { if (fields[j] == extract[i]) { break } } if (j > nfields) { printf("***ERROR*** field not found - %s\n", extract[i]) continue } if (i > 1) printf(" ") # no overide character for this field if (no[j] == "") { printf("%s%s%s", prefix[j], $j, suffix[j]) continue } # overide character exist - split up the field n = length($j) first = substr($j, 1, 1) last = substr($j, n, 1) # no overide character in field value if (first != no[j] && last != no[j]) { printf("%s%s%s", prefix[j], $j, suffix[j]) continue } middle = "" if (n >= 3) { middle = substr($j, 2, n-2) } if (first != no[j]) { printf("%s%s", prefix[j], first) } printf("%s", middle) if (last != no[j]) { printf("%s%s", last, suffix[j]) } } printf("\n")}'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -