Sponsored Content
Top Forums Shell Programming and Scripting Bash - re-ordering list of parameters Post 303018879 by Don Cragun on Monday 18th of June 2018 05:44:08 AM
Old 06-18-2018
In post #1 you said that your input lines are terminated with 'CR', which I assume you meant to be a <carriage-return> character. But the sample file you uploaded (main.cf.txt) does not contain any <carriage-return> characters; instead it contains normal UNIX text files with lines terminated by <newline> characters.

In post #1 you showed us sample input data containing multiple adjacent lines starting with <tab>. In the file you uploaded, that never happens, but there are multiple occurrences of configuration lines followed by <tab>bed lines.

In post #1 you didn't mention anything about comment lines nor about empty lines that are not supposed to be sorted, but there are lines at the start of the file you uploaded that I assume are not intended to be sorted. (But, of course, that is a wild assumption because you have not really shown us what output should be produced by processing the file you uploaded.)

You also mention in post #1:
Quote:
But line 2 and 3 of the concerning parameter start with a tab char (but should be one or more space).
but there aren't any <tab> characters in your example in post #1 and there aren't any leading <space> characters in the file you uploaded.

Assuming that you want all lines starting with a "#" and all blank lines to appear unsorted at the start of the output file produced (in the order in which they were found in the input) and that the first lines of configuration data are to be sorted into alphanumeric order with continuation lines (any line that contains at least one non-blank character but with a first character that is a <space> or a <tab>) unsorted and attached to the configuration line it follows, the following bash script using awk and sort to preprocess data to be sorted, sort to sort the configuration data, and awk to post process the sorted data seems to do what I'm guessing you want:
Code:
#!/bin/bash
# Create a name for hte temporary output file to be used by sort.
sorted_cf="sorted.cf."$$

# Use awk to preprocess your input file:
#	directly printing comments and blank lines.
#	using sort to sort configuaration data, and
#	postprocess the sorted configuration data to print the sorted
#	    configuratoin data.
awk -v sorted_file="$sorted_cf" '
BEGIN {	# Set input and output field separators.
	FS = OFS = "\r"
	# Set sort command to be used to sort confiiguration data (not comments).
	sort = "sort -t\"\r\" -k1,1 -k2,2n -k3,3n -o " sorted_file
}
/^#/ || /^[ \t]*$/ {
	# Print comments and blank lines at start of output.
	print
	next
}
/^[ \t]/ {	
	# Filter non-blank lines starting with a blank by creating a line to be
	# sorted on the previous line not starting with a blank, a count of the
	# number of times that line has been seen, and a count of the lines seen
	# since that line was.  Also print (but do not sort) the contents of 
	# this line.
	print last, n[last], ++seq, $0 | sort
	next
}
{	# Filter non-blank lines starting with a non-blank by creating a line to
	# be sorted on the full contents of this line, the number of times this
	# line has been seen, and 1 (the number of lines in this set so far).
	print last = $0, ++n[$0], seq = 1 | sort
}
END {	# Close the output to be filtered through the sort utility.
	close(sort)
	# And read back i nthe sorted configuration data...
	while ((getline < sorted_file) == 1) {
		if(NF == 3)
			# For lines containing initial lines and counts, print
			# just the initial line data.
			print $1
		else if(NF == 4)
			# For lines containing initial lines, counts, and a
			# continuation line, print just the continuation line.
			print $4
	}
}' main.cf.txt # close the awk script and name the file to be processed.

# Remove the temporary output file produced by sort.
rm -f "$sorted_cf"

With the sample data you uploaded, this produces the output:
Code:
#####################################
#										#
#	{config_jcd}							#
#										#
#	/etc/postfix/main.cf
#										#
#	/etc/postfix/main.cf.lst.sort  sort no comments
#										#
#	INSTALL VERSION						#
#										#
#	§2018_06_15§							#
#										#
#	¨version:27-0-0¨						#
#										#
#	ɸmodif_version:0-0-1ɸ				#
#										#
#####################################

alias_maps = 
biff = no
canonical_maps = 
command_directory = /usr/sbin
compatibility_level = 2
content_filter = 
daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
	 ddd $daemon_directory/$process_name $process_id & sleep 5
debug_peer_level = 2
debugger_command =
defer_transports = 
delay_warning_time = 0h
disable_dns_lookups = no
disable_mime_output_conversion = no
disable_vrfy_command = yes
html_directory = /usr/share/doc/packages/postfix-doc/html
inet_interfaces = all
inet_protocols = ipv4
mail_owner = postfix
mail_spool_directory = /var/mail 
mailbox_command = 
mailbox_size_limit = 0
mailbox_transport = 
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
masquerade_classes = envelope_sender, header_sender, header_recipient
masquerade_domains = 
masquerade_exceptions = 
message_size_limit = 0
message_strip_characters = 
mydestination = $myhostname, localhost.$mydomain
myhostname = localhost
mynetworks_style = subnet
newaliases_path = /usr/bin/newaliases
	 PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/packages/postfix-doc/README_FILES
relay_clientcerts = 
relay_domains = $mydestination, hash:/etc/postfix/relay
relayhost = 
relocated_maps = 
sample_directory = /usr/share/doc/packages/postfix-doc/samples
sender_canonical_maps = 
sendmail_path = /usr/sbin/sendmail
setgid_group = maildrop
smtp_enforce_tls = no
smtp_sasl_auth_enable = no
smtp_sasl_password_maps = 
smtp_sasl_security_options = 
smtp_tls_CAfile = 
smtp_tls_CApath = 
smtp_tls_cert_file = 
smtp_tls_key_file = 
smtp_tls_session_cache_database = 
smtp_use_tls = no
smtpd_banner = $myhostname ESMTP
smtpd_client_restrictions = 
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = 
smtpd_recipient_restrictions = 
smtpd_sasl_auth_enable = no
smtpd_sender_restrictions = 
smtpd_tls_CAfile = 
smtpd_tls_CApath = 
smtpd_tls_ask_ccert = no
smtpd_tls_cert_file = 
smtpd_tls_key_file = 
smtpd_tls_received_header = no
smtpd_use_tls = no
strict_8bitmime = no
strict_rfc821_envelopes = no
transport_maps = 
unknown_local_recipient_reject_code = 550
virtual_alias_domains =

If this isn't what you're trying to do, please specify much more clearly exactly what it is that you're trying to do and show us the output you are trying to produce.
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

BASH: how to launch a program with parameters

Hi, I'm a pretty big fan of BASH scripting. I've got a bunch I use for random things and lately a couple issues have been plaguing me. Both are somewhat related, in that they deal with filenames with spaces and "escaped" characters and with launching a program with command line arguements... (5 Replies)
Discussion started by: TinCanFury
5 Replies

2. Shell Programming and Scripting

Get the List of functions with modified parameters

Hi I have 2 files a.c and a.bak where I changed long to int using awk script. I want to get the list of functions whose parameters got modified for eg: fun ( long a, long b ) might be changed to fun ( int a, int b ) (1 Reply)
Discussion started by: Sivaswami
1 Replies

3. Shell Programming and Scripting

bash if loop for checking multiple parameters

Hello, I've got next problem: I want to examine at the beginning of a script in an if loop that: 1. Is there 4 parameters given 2. If first state is true then: is there switches -e and -d? 3. At the end, how can i indentify them as variebles regardlees to its order. I was thinking like... (2 Replies)
Discussion started by: szittyafergeteg
2 Replies

4. Shell Programming and Scripting

Parameters passed to commands but not working in Bash shell

Hi, I am trying to do this thing useing my shell bash ( sorry for my english ) I have in a file 63 hostnames, i wanna ask to the DHCP admin, to reserv that reserves 63 IP addresses of this hosts, using their mac address. I have thinked this script: for ((i=1;i<63;i++)); do arp $(head... (10 Replies)
Discussion started by: Cypress
10 Replies

5. Shell Programming and Scripting

bash script function parameters

I have a question about bash script. Can I create a function there that accept parameters like functions in program language? (2 Replies)
Discussion started by: programAngel
2 Replies

6. Shell Programming and Scripting

Ordering HTML Drop Down List entries Alphabetically

Hi, So I have a web page that has some drop down boxes with a whole bunch of entries. Unfortunately, they have been added over time and started from a small list and is now extremely messy. I'm looking to write script so I can just copy in the section of the HTML code and have it sorted for... (6 Replies)
Discussion started by: jedel
6 Replies

7. Shell Programming and Scripting

Passing parameters to bash script function (or subroutine)

I've found a few posts regarding passing parameters to a function or subroutine, but for some reason when I try to run a command based on part with these parameters it's not working. If I have the function echo the parameters they show correctly so I believe they are being passed right but the... (2 Replies)
Discussion started by: withanh
2 Replies

8. Shell Programming and Scripting

Bash Positional Parameters Question

In a Bash script I used getopts command to let a user does something regards to the selected options. The question is: How do you find out what is the name of the file that user inserted in the command line like the following: The good part is this file is always the last argument in the... (2 Replies)
Discussion started by: bashily
2 Replies

9. Shell Programming and Scripting

How to call a bash script with positional parameters?

Hi, I have a script which will be executed using the below command, bin/nutch crawl urls -dir /data/test/ bin/nutch - Script file crawl, urls, /data/test/ - Parameters -dir - Option The above script should executed from a shell script named test.sh. I have the below code to execute... (2 Replies)
Discussion started by: vel4ever
2 Replies

10. Shell Programming and Scripting

How do i check if all parameters are set in bash?

Hi, I have 4 parameters passed to my shell and i validate if all four are entered using the following snippet: if then echo "Not entered" else echo "entered" fi I get the following output as 'Not entered even when i enter the values for all prompts. Please advise. Thanks. (5 Replies)
Discussion started by: Jesshelle David
5 Replies
All times are GMT -4. The time now is 09:13 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy